我正在尝试递归地实现一个程序。我只是不明白为什么我的最后一行被执行了两次
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");
为什么 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");