递归函数 - 不断返回 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
。
如果输入小于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?的主要内容,如果未能解决你的问题,请参考以下文章