我正在尝试递归地实现一个程序。我只是不明白为什么我的最后一行被执行了两次
I am trying to implement a program recursively. I just don't understand why my last line is being executed twice
为什么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
语句。
相关文章:
- 为什么我的最后一个 ELSE 条件无法正确执行
- 我的C++程序只写入文本文件最后一个条目
- 我必须更改我的数字最后一个数字和第一个数字,但不要使用仅带有整数或循环的函数.例如从 12345 到 52341
- 我正在尝试将我的 c++ 数组从第二个索引切到最后一个索引
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- Ofstream一直给我函数的最后一行,而不是显示所有内容
- 我必须将 LL 的最后 n 个元素附加到前面
- 我的C++文件期望用'while'代替 if。最后,它预计会出现'('
- 为什么我的代码不给最后两个数字
- c ++ 我的 char* 数组被最后一个添加的元素覆盖
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 我在spoj-lastdig2中使用我的代码 - 重新访问的最后一位数字
- 为什么最后创建的Qt3DCore::QEntity总是在我的场景视图的前景中?
- 我的 C 样式字符串中的最后字符是 I 时的奇数值
- 为什么我的代码只读取文件的最后一行
- vector.erase-它总是删除我的最后一个元素
- 当我采用测试用例数 = 1 时,我的程序终止.其他明智的是,它给出了正确的答案,但跳过了最后一个测试用例
- 我在一个简单控制台程序(c++)中的第一列代码最终成为我的最后一列
- 我的最后一个正则表达式不起作用,但我无法弄清楚原因
- 我正在尝试递归地实现一个程序。我只是不明白为什么我的最后一行被执行了两次