对C ++递归感到困惑

时间:2020-08-24 08:56:57

标签: c++ recursion

我不明白递归的效果如何。

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,然后又发生了什么?我真的不明白这两个调用的作用,以及为什么还有第二个调用在那里,因为第一个调用首先被调用。

3 个答案:

答案 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

在这里,递归结束时的nn。这就是为什么序列中其他所有数字都为1(分别对应第1点和第3点)的原因

如果删除1,则顺序为:

1

现在,递归“结束”时的2 3 2 4 2 3 2n(显然它在2处结束了,但是现在我们要上移一层),所以我们重复该算法。

如果您删除了1 ...

2

同样,3 4 33 ...,而您的最高级别是剩余的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,然后返回。