我正在尝试递归地实现一个程序。我只是不明白为什么我的最后一行被执行了两次

I am trying to implement a program recursively. I just don't understand why my last line is being executed twice

本文关键字:我的 最后 为什么 明白 两次 执行 一行 递归 实现 程序 一个      更新时间:2023-10-16

为什么Hi被打印了4次?在函数最终返回完整的值之前,它只会执行一次。

#include <stdio.h>
int k = 0;
int factorial (unsigned int i) {
  if (i <= 1) {
    return 1;
  } else {
    k = i * factorial(i - 1);
  }
  printf("hi"); // Why is Hi being printed 4 times. 
  return k;
}
int main() {
  int i = 5;
  printf("Factorial of %d is %dn", i, factorial(i));
  return 0;
}

因为您的代码以这种方式执行:

k = 5 * factorial(5 - 1);
    k = 4 * factorial(4 - 1);
        k = 3 * factorial(3 - 1);
            k = 2 * factorial(2 - 1);
               return 1;
            printf("hi"); 
        printf("hi"); 
    printf("hi"); 
printf("hi"); 

当函数试图调用自己时,您的printf可能正在排队。

让我们一次又一次地检查它-

i = 5
迭代1:

k = 5 * factorial(4);
迭代2:

k = 4 * factorial(3);
迭代3:

k = 3 * factorial(2);
迭代4:

k = 2 * factorial(1);

此时,factorial(1)实际返回1。注意,没有到达printf行。

现在,这个值在第4次迭代中被传递给k,并在执行printf时返回给调用者。

同样发生在迭代3中,它在执行另一个printf时接收k中的值并将其返回给调用者,即迭代2。

现在,迭代2接收到k的值并将其返回给调用者,即迭代1同时执行另一个printf(第三次!)

最后,迭代1接收k的值并返回它,同时它执行最后的printf (Total 4)

我希望这解释了你的问题!对于ref: http://ideone.com/VgIwKX

函数factorial()被调用了五次:

  • 第一次使用main()方法和
  • 递归四次。

当参数i> 1时,函数打印"hi"。即使您使用递归,如果程序(或函数)在到达终点时结束执行,对于函数,终点是return语句。

相关文章: