我不明白递归的效果如何。
void f(int n)
{
if (n == 1)cout<<1<<" ";
else
{
f(n - 1);
cout<<n<<" ";
f(n - 1);
}
如果我让n = 4,则将输出1 2 1 3 1 2 1 4 1 2 1 3 1 2 1
。这是为什么?首先,n
越来越小,直到达到1,然后又发生了什么?我真的不明白这两个调用的作用,以及为什么还有第二个调用在那里,因为第一个调用首先被调用。
答案 0 :(得分:6)
递归函数的工作原理与非递归函数完全相同。
特别是,当一个用户返回时,它会返回其直接调用方。
也就是说,具有n == 1
的呼叫将返回具有n == 2
的呼叫,该呼叫将返回具有n == 3
的呼叫,依此类推,并且调用函数继续进行常规方式。
您的示例就像这些非递归函数一样工作,您可能会发现它们的流程:
void f_1()
{
cout << 1 << " ";
}
void f_2()
{
f_1();
cout << 2 << " ";
f_1();
}
void f_3()
{
f_2();
cout << 3 << " ";
f_2();
}
void f_4()
{
f_3();
cout << 4 << " ";
f_3();
}
答案 1 :(得分:0)
算法是,当到达递归结束时:
n
n + 1
的{{1}} n
在这里,递归结束时的n
是n
。这就是为什么序列中其他所有数字都为1(分别对应第1点和第3点)的原因
如果删除1
,则顺序为:
1
现在,递归“结束”时的2 3 2 4 2 3 2
是n
(显然它在2
处结束了,但是现在我们要上移一层),所以我们重复该算法。
如果您删除了1
...
2
同样,3 4 3
是3
...,而您的最高级别是剩余的n
。
由于对称算法,您会看到对称序列:
4
答案 2 :(得分:0)
下面是对正在发生的事情的递归解释。
当n
降到n=1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 2
,现在它从else
语句的第一行向下移动到第二行,并打印2,然后是第三个,这是另一个以n = 2
重新启动函数的递归调用。
因此,我们再次经历else
的第一条语句,我们得到n = n - 1 = 1
。
当n
降到n = 1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 2
,现在它从else
语句的第三行移出并返回。
返回时,我们返回到n
的上一个迭代n = 3
,现在它从else
语句的第一行向下移动到第二行,并打印3,然后是第三个,这是另一个以n = n - 1 = 2
重新启动函数的递归调用。
因此,我们再次经历else
的第一条语句,我们得到n = n - 1 = 1
。
当n
降到n = 1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 2
,现在它从else
语句的第一行向下移动到第二行,并打印2,然后是第三个,这是另一个以n = n - 1 = 1
重新启动函数的递归调用。
当n
降到n = 1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 4
,现在它从else
语句的第一行向下移动到第二行,并打印4,然后是第三个,这是另一个以n = n - 1 = 3
重新启动函数的递归调用。
因此,我们再次经历else
的第一条语句,我们得到n = n - 1 = 2
。
因此,我们再次经历else
的第一条语句,我们得到n = n - 1 = 1
。
当n
降到n = 1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 2
,现在它从else
语句的第一行向下移动到第二行,并打印2,然后是第三个,这是另一个以n = n - 1 = 1
重新启动函数的递归调用。
当n
降到n = 1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 3
,现在它从else
语句的第一行向下移动到第二行,并打印3,然后是第三个,这是另一个以n = n - 1 = 2
重新启动函数的递归调用。
因此,我们再次遍历else
的第一条语句,得到n = n - 1 = 2
。
因此,我们再次遍历else
的第一条语句,得到n = n - 1 = 1
。
当n降到n = 1
时,if
部分开始,打印1,然后返回。
返回时,我们返回到n
的上一个迭代n = 2
,现在它从else
语句的第一行向下移动到第二行,并打印2,然后是第三个,这是另一个以n = n - 1 = 1
重新启动函数的递归调用。
当n
降到n = 1
时,if
部分开始,打印1,然后返回。