我试图写一个递归函数,它返回一个数字的阶乘。如果数字为0或负数,则应返回0。 然而,每当我测试它时,它总是返回0,有人可以对此有所了解吗?
int factorial( int integer)
{
if( integer <= 0)
{
return 0;
}
else
return integer* (factorial(integer-1));
}
答案 0 :(得分:4)
您总是会在基本情况下将结果乘以零。 0
的因子为1
,而不是0
。
如果输入小于0
时函数必须返回1
:
int factorial (int integer) {
if (integer < 1) {
return 0;
} else if (integer == 1) {
return 1;
} else {
return integer * factorial(integer-1);
}
}
不是最短的实现,但非常易读。
答案 1 :(得分:4)
因为它一直用整数-1调用自身,它最终会用0调用自己,然后你会有这样的调用:
return integer * (factorial(0))
将解析为
return integer * 0
是0
答案 2 :(得分:3)
您的函数必须在基本情况下返回1
,如下所示:
if (integer <= 0) {
return 1;
}
您正在乘以数字,因为您知道任何乘以0
的数字为零。您需要使用的是1
乘法标识,因为任何数字乘以1都是数字本身。
答案 3 :(得分:2)
尝试使用铅笔和纸张执行简单的测试用例:
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)
因此,似乎每次递归调用都会到达&#34; 0&#34;。
尝试添加此条件:
else if(integer == 1)
return 1;
答案 4 :(得分:1)
简单地使用1而不是0.当你使用0时,任何数字都会乘以0,返回0。
示例:
5! = 5.4.3.2.1 = 120而不是5.4.3.2.1.0 = 0
答案 5 :(得分:1)
您允许整数通过递归调用上升到零,并在发现整数为零时返回零。因此,您将最后一次递归调用的结果乘以零。因此,你总是得到零作为答案。
答案 6 :(得分:0)
您必须返回1
,乘以0
始终返回0
:
if( integer < 2)
{
return 1;
}