有多种可能性,探讨的控制流程(只要没有多线程或多处理这是不是在这种情况下)。
一个选项是在调试器中逐步执行您的示例代码。另一个选项可能是“printf”调试。对于这一点,我添加了一些printf()
s到您的一部开拓创新代码:
#include <stdio.h>
void display(int n, int depth)
{
printf("%*sdisplay(%d) entered\n", depth * 4, "", n);
if (n) {
printf("%*s1st call display(%d)\n", depth * 4, "", n - 1);
display(n - 1, depth + 1);
printf("display 1\n");
printf("%*s2nd call display(%d)\n", depth * 4, "", n - 1);
display(n - 1, depth + 1);
printf("display 2\n");
}
printf("%*sleaving display(%d)\n", depth * 4, "", n);
}
int main(void)
{
/*
printf("call display(5)\n");
display(5, 0);
*/
printf("call display(2)\n");
display(2, 1);
return 0;
}
编译和执行上ideone:
call display(2)
display(2) entered
1st call display(1)
display(1) entered
1st call display(0)
display(0) entered
leaving display(0)
display 1
2nd call display(0)
display(0) entered
leaving display(0)
display 2
leaving display(1)
display 1
2nd call display(1)
display(1) entered
1st call display(0)
display(0) entered
leaving display(0)
display 1
2nd call display(0)
display(0) entered
leaving display(0)
display 2
leaving display(1)
display 2
leaving display(2)
另外,我用缩进以可视化的递归深度。 那么,现在还不清楚吗?
因此,display()
每次调用使得两个递归下降(如果n
尚未0
),其中被叫display()
再次使得两个递归下降(如果n
尚未0
)等等(直到递归的终止)。
这种模式非常类似的常见应用是计算Fibonacci number。
树形结构的遍历是该模式的另一个类似应用(在Tree traversal中提到)。在binary tree的情况下,每个步骤有两种可能的递归调用。 (在一般的树中,有多少递归调用,因为节点有孩子。)
忽略图像描述部分XD.But该链接输出了代码 –
当你写'display_1'和' display_2'?你的代码只有一个函数display(),并输出到字符串“display 1”和“display 2”(没有下划线)。这些之间没有“关系”,只是一个调用自身的函数,和两个写入stdout的字符串。 –