从阶乘递归中理解此输出

时间:2018-05-19 13:57:37

标签: c

在这个阶乘递归中,“printf”输出2 6 8,无法理解为什么......

  #include <stdio.h>

int f(int n)
{
    int k;
    if (n==1)
        return 1;
    else
        k = n*f(n-1);

  printf("%d ",k);

}

int main()
{
    f(4);
}

2 个答案:

答案 0 :(得分:2)

问题中代码的原始版本是:

int f(int n) {
    int k;
    if (n == 1)
        return 1;
    else
        k = n * f(n - 1);

    printf("%d ", k);
}

int main() {
   f(4);
}

此代码具有未定义的行为,因为如果n != 1没有正确返回值,导致调用代码在其自己的计算中使用不可预测的值。行为未定义,任何事情都可能发生。

添加return语句修复了此问题。但请注意这些额外的要点:

  • 变量kf函数中无用。
  • f应返回1参数0
  • 您应在该号码后输出换行符,并在0中返回main

以下是修改版本:

#include <stdio.h>

int f(int n) {
    if (n <= 1)
        return 1;
    else
        return n * f(n - 1);
}

int main() {
    int i;
    for (i = 0; i < 10; i++) {
        printf("%d! = %d\n", i, f(i));
    }
    return 0;
}

答案 1 :(得分:1)

你在这里犯了很多错误:

printf("%d ",k);

此行永远不会被执行,因为在任何情况下if() else子句都将在它之前返回。