具有两个递归调用的递归函数如何工作?

时间:2014-12-25 20:05:10

标签: c++

我目前正在阅读C ++指南,我现在处于递归部分,我对这个过程如何解决这个问题感到有些困惑。以下是书籍示例中的代码:

void subdivide(char ar[], int low, int high, int level)
{
    if (level == 0)
        return;
    int mid = (high + low)/2;
    ar[mid] = '|';
    subdivide(ar, low, mid, level - 1); // #1
    subdivide(ar, mid, high, level -1); // #2
}

到目前为止,我理解#1递归调用一直持续到基本情况为0,然后最终#2递归调用发生。但是,当我们第一次激活#2呼叫时,它还会激活#1呼叫?或者#1呼叫在完成后永久停止工作,这样每次我们用#2递归它都会跳过#1并进入#2呼叫?

3 个答案:

答案 0 :(得分:0)

当您递归到#2时,将使用参数的新值再次执行整个函数。这意味着不会跳过#1(除非level0,在这种情况下函数会立即返回。)

答案 1 :(得分:0)

第一个电话不会永久停止工作。每次执行第二次(#2)时,再次调用#1函数。 此外,当#1执行时,它会调用#1和#2,依此类推。

答案 2 :(得分:0)

当您递归时,整个函数会再次运行,具有不同的初始状态(参数和所做的任何更改)。

最终运行的是一棵树'递归调用 - 粗略的两个 - 大概 - 但没有递归超过level深。

"画一个栅栏,如果它是一块板,从上到下涂漆。否则,沿着板边缘从左到右划分栅栏。使用此算法绘制左半部分,然后绘制右边。"

这在英语中描述了一个类似的递归结构。在你的情况下,我们将你的范围分成两部分,在中间划分一个分隔标记,然后在每一半重复。