很抱歉提出一个非常基本的问题,关于已经多次讨论的论点,我只是想不通答案。我试着在论坛上搜索已经在主题上提问的问题,但没有找到确切的答案(或者没有理解答案)。
为什么当按不同顺序调用时,此函数会打印从i到10的两倍数字? 它不应该以相同的顺序打印出来吗?我一直听说这是递归的工作方式:每个函数在其代码中调用另一个相同的函数,只应用于较小的域,直到满足结束条件。此时它应该返回(回溯)到原始函数;这是我不明白的,为什么它返回(不打算作为语法调用)到main函数。
void count(int i){
if(i < 10){
printf("%d\n", i);
count(i + 1);
printf("%d\n", i);
}
}
谢谢。
答案 0 :(得分:6)
7号电话:
count(7)
output 7
count(8)
output 8
count(9)
output 9
count(10)
end
output 9
end
output 8
end
output 7
end
为什么不回来?
每个函数调用有时会返回,即使它是一个递归函数。
答案 1 :(得分:2)
与任何函数调用一样,最后,执行只是在下一行开始备份:
printf("%d\n", i);
// into the function
count(i + 1);
// out of the function
printf("%d\n", i);
重要的是要知道i
的值不会更新。它们不是同一个变量。 i
有十个不同的“版本”。
printf("%d\n", i); // i is 3
count(i + 1);
printf("%d\n", i); // i is still three, but a version of the function just ran where i is 4
如果你想象在看到count(i + 1)时粘贴代码,你会在扩展count(8)时得到这个:
if(8 < 10){
printf("%d\n", 8);
count(8 + 1);
printf("%d\n", 8);
}
现在粘贴:
if(8 < 10){
printf("%d\n", 8);
if(9 < 10){
printf("%d\n", 9);
count(9 + 1);
printf("%d\n", 9);
}
printf("%d\n", 8);
}
再次:
if(8 < 10){
printf("%d\n", 8);
if(9 < 10){
printf("%d\n", 9);
if(10 < 10){
// we'll never get here
}
printf("%d\n", 9);
}
printf("%d\n", 8);
}
这是实际运行的代码。 i
的“旧”值不会改变。最后,您在调用函数的所有不同时间内有10个不同的i
变量。