尝试为我的课堂写阶乘问题,但输出错误。不明白我在做什么错。这是我的代码。
int fact(int number) {
if(number == 0) {
return 1;
}
return fact_i(number, 1);
}
int fact_i(int curNumber, int sum) {
if(curNumber == 1) {
return sum;
} else {
return fact_i(curNumber - 1, sum);
}
}
答案 0 :(得分:2)
您永远不要将sum
乘以数字,因此它不能超过一个。递归应为:
return fact_i(curNumber - 1, curNumber * sum);
请注意,在这种情况下,针对尾调用优化是没有意义的。尽管C ++编译器一般可以(Which, if any, C++ compilers do tail-recursion optimization?)做到这一点,但是您不能依赖它,因为未指定它,并且您可能会先溢出int
仍然达到任何堆栈限制。
答案 1 :(得分:1)
执行尾递归阶乘的正确方法是:
int fact(int number) {
if(number == 0) {
return 1;
}
return fact_i(number, 1);
}
int fact_i(int curNumber, int sum) {
if(curNumber == 1) {
return sum;
} else {
return fact_i(curNumber - 1, sum*curNumber);
}
}
您错过了curNumber
行中的sum
与return fact_i(curNumber - 1, sum);
的乘积
答案 2 :(得分:0)
错误在一行中
return fact_i(curNumber - 1, sum);
它必须是:
return curNumber*fact_i(curNumber - 1, sum);
否则,结果永远不会累积。您只需继续在递归调用链中传递1
。
您正在使用两个终止条件-一个为fact
,另一个为fact_i
。您只能使用一种终止条件来简化代码。
int fact_i(int curNumber, int sum) {
if(curNumber == 1) {
return sum;
}
// No need for an else here.
return fact_i(curNumber - 1, (curNumber-1)*sum);
}
int fact(int number) {
return fact_i(number, number);
}