【问题标题】:output of recursive function in cc中递归函数的输出
【发布时间】:2019-12-04 14:56:26
【问题描述】:

我试图找出一个简单递归函数的输出,该函数计算 c 中函数内给定数字的阶乘。我对执行顺序感到困惑 这个printf 线printf("returning %d\n", val);

我希望这段代码的输出是:

called with par = 4
called with par = 3
called with par = 2
called with par = 1
returning 24
24

但是输出是:

called with par = 4
called with par = 3
called with par = 2
called with par = 1
returning 2
returning 6
returning 24

代码:

int factorial(int n);
int main(void)
{

printf("%d",factorial(4));

}


int factorial(int n)
{
    int val;
    if ((n == 0) || (n == 1)) 
    {
        printf("called with par = %d\n", n);
        return 1;
    }

    else 
    {
        printf("called with par = %d\n", n);
        val = n * factorial(n - 1);
        printf("returning %d\n", val);
        return val;
    }
}

【问题讨论】:

  • 每次调用它,它都会返回到调用它的位置。在它调用自己之后,它又返回到自己。这很令人惊讶吗?
  • 你能解释一下为什么你认为你的输出是正确的吗?
  • 除基本情况 (n == 0 || n == 1) 之外的每个调用都将打印“调用方式”和“返回”。
  • 如果您学习如何使用调试器逐个语句逐句执行代码,并逐步执行递归调用,可能会帮助您更好地了解正在发生的事情。

标签: c recursion output


【解决方案1】:

如果我们以您的 factorial(4) 为例,它会变成这样:

阶乘(4) 打印“以par = 4调用” val = 4 * 阶乘(3) 打印“以 par = 3 调用” val = 3 * 阶乘(2) 打印“以 par = 2 调用” val = 2 * 阶乘(1) 打印“以 par = 1 调用” 返回 1 打印“返回 2” // 2 * 1 = 2 返回 2 打印“返回 6” // 3 * 2 = 6 返回 6 打印“返回 24” // 4 * 6 = 24 返回 24

每次调用n > 1(不幸的是n < 0)都会打印"called with...""returning..."

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2021-09-28
    • 2011-01-17
    • 2023-01-25
    相关资源
    最近更新 更多