我目前正在阅读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呼叫?
答案 0 :(得分:0)
当您递归到#2时,将使用参数的新值再次执行整个函数。这意味着不会跳过#1(除非level
是0
,在这种情况下函数会立即返回。)
答案 1 :(得分:0)
第一个电话不会永久停止工作。每次执行第二次(#2)时,再次调用#1函数。 此外,当#1执行时,它会调用#1和#2,依此类推。
答案 2 :(得分:0)
当您递归时,整个函数会再次运行,具有不同的初始状态(参数和所做的任何更改)。
最终运行的是一棵树'递归调用 - 粗略的两个 - 大概 - 但没有递归超过level
深。
"画一个栅栏,如果它是一块板,从上到下涂漆。否则,沿着板边缘从左到右划分栅栏。使用此算法绘制左半部分,然后绘制右边。"
这在英语中描述了一个类似的递归结构。在你的情况下,我们将你的范围分成两部分,在中间划分一个分隔标记,然后在每一半重复。