这是我的代码:
#include <stdio.h>
void fun(int n)
{
if(n > 0)
{
fun(n-1);
printf("%d ", n);
fun(n-1);
}
}
int main()
{
fun(4);
return 0;
}
,此代码的输出为1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
。
但我无法理解递归调用之间究竟发生了什么,何时执行print语句以及每次调用时n
的值是多少。
我是编码的初学者,请逐步解释。
答案 0 :(得分:2)
如果从接近递归的基本情况开始的事情开始,将更容易理解发生了什么。假设您fun(0)
中有main
。在fun
体内发生这种情况:
void fun(int n)
{
if(n > 0) //this is false, so function does nothing
{
fun(n-1);
printf("%d ", n);
fun(n-1);
}
}
现在如果foo(1)
中有main
怎么办?
void fun(int n)
{
if(n > 0) //this is true, lets execute the block
{
fun(n-1); //call fun(0), this does nothing
printf("%d ", n); //print value 1
fun(n-1);//call fun(0) again, does nothing
}
}
因此您可以看到fun(1)
将打印值1,fun(2)
怎么样?
void fun(int n)
{
if(n > 0)
{
fun(n-1); //call fun(1), prints 1
printf("%d ", n);//print value 2
fun(n-1); //call fun(1), prints 1
}
}
因此,您可以看到foo(2)
将打印“1 2 1”,同样foo(3)
将打印1 2 1 3 1 2 1
这称为纯结构递归,在递归的每一步都接近基本情况。