阶乘问题在C ++中给出错误的输出

时间:2018-10-08 06:06:54

标签: c++ factorial

尝试为我的课堂写阶乘问题,但输出错误。不明白我在做什么错。这是我的代码。

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);
    }
}

3 个答案:

答案 0 :(得分:2)

  1. 您永远不要将sum乘以数字,因此它不能超过一个。递归应为:

    return fact_i(curNumber - 1, curNumber * sum);
    
  2. 请注意,在这种情况下,针对尾调用优化是没有意义的。尽管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行中的sumreturn 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);
}
相关问题