递归函数 - 不断返回 0?

Posted

技术标签:

【中文标题】递归函数 - 不断返回 0?【英文标题】:Recursive function- keeps returning 0? 【发布时间】:2012-02-23 13:42:13 【问题描述】:

我正在尝试编写一个返回数字阶乘的递归函数。如果数字为 0 或负数,则应返回 0。 但是每次我测试它时,它总是返回 0,请问有人能解释一下吗?

int factorial( int integer)

    if( integer <= 0)
    
        return 0;
    

    else

        return integer* (factorial(integer-1));

 

【问题讨论】:

【参考方案1】:

因为它一直用整数 - 1 调用自己,它最终会用 0 调用自己,然后你将有这样的调用:

return integer * (factorial(0))

这将解决

return integer * 0

0

【讨论】:

感谢大家的回答,但是有人告诉我,如果输入0或负数,该方法必须返回0。有没有办法实现? 可以,只要再加一个“if”:如果参数为1,则返回1。【参考方案2】:

在基本情况下,您将始终将结果乘以零。 0 的阶乘是 1,而不是 0

FactorialWikipedia Empty ProductWikipedia

如果输入小于1时函数必须返回0

int factorial (int integer) 
    if (integer < 1) 
        return 0;
     else if (integer == 1) 
        return 1;
     else 
        return integer * factorial(integer-1);
    

不是最短的实现,但可读性很强。

【讨论】:

【参考方案3】:

您的函数必须在基本情况下返回 1,如下所示:

if (integer <= 0) 
    return 1;

您正在乘以数字,并且您知道任何数字乘以0 都是零。您需要改用 1,即乘法恒等式,因为任何数字乘以 1 就是数字本身。

【讨论】:

【参考方案4】:

尝试用铅笔和纸执行一个简单的测试用例:

main:
  factorial(3)
    return 3 * factorial(2)
      factorial(2)
        return 2 * factorial(1)
          factorial(1)
            return 1 * factorial(0)
              factorial(0)
                return 0
            return 1 * 0 (equals 0)
        return 2 * 0 (equals 0)
   return 3 * 0 (equals 0)

因此,似乎每个递归调用都达到“0”。

尝试添加这个条件:

else if(integer == 1)
  return 1;

【讨论】:

【参考方案5】:

只需使用 1 而不是 0。当您使用 0 时,您拥有的任何数字都将乘以 0,返回 0。

例子:

5! = 5.4.3.2.1 = 120 而不是 5.4.3.2.1.0 = 0

【讨论】:

【参考方案6】:

您允许整数通过递归调用达到零,并在发现整数为零时返回零。因此,您将最后一次递归调用中的结果乘以零。因此,您总是得到零作为答案。

【讨论】:

【参考方案7】:

你必须返回1,乘以0总是返回0

if( integer < 2)

    return 1;

【讨论】:

以上是关于递归函数 - 不断返回 0?的主要内容,如果未能解决你的问题,请参考以下文章

9-[函数]-递归函数

递归和迭代

初识python: 递归函数

第二模块 3.8 函数的递归

如何退出方法,即如何从java中的递归函数返回?

函数递归及面向过程编程