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

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

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

#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 %d\n", i, factorial(i));
  return 0;
}

函数factorial()被调用五次:

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

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

您的 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)实际上returns1.注意printf行,以防万一

现在,这个值在迭代 4 中被馈送到 k,并在执行 printf.

时返回给调用者

迭代 3 中也发生同样的情况,它在 k 中接收一个值,并在 returns 中将其传递给调用者,即迭代 2,同时执行另一个 printf

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

最后,迭代 1 收到 k 和 returns 的值,并随之执行最终的 printf(共 4 次)

我希望这能解释你的问题! 供参考:http://ideone.com/VgIwKX

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

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