分析“双重递归”详细执行顺序

很多朋友理不清“双重递归”执行顺序,下面,我以画分形树代码为例,来分析一下“双重递归”的详细执行过程和变量的变化。为了更容易理解点,画一棵小点的树。
图片在这里插入图片描述
分析“双重递归”详细执行顺序_第1张图片

先定义了一个名为“tree”的函数,并在函数内两次调用函数本身。 tree(zhichang)可以分为三分部分:“画右侧树枝”“画左侧树枝”“返回节点”。程序画树的顺序见下面步骤图:

分析“双重递归”详细执行顺序_第2张图片

一、下面我们先简单分析这三段代码(可跳过此段阅读):

1、画右侧树枝:先向前移动zhichang,然后向右转20度,再调用函数本身,画下一段树枝(zhichang-15),然后再右转20度,再画下一段树枝(zhichang-15),每次画树枝都比上一次短15,为了避免无休止画下去,我们加个条件zhichang>5,如果不满足这个条件,就不再向下执行。

分析“双重递归”详细执行顺序_第3张图片

2、画左侧树枝:
当右侧树枝不满足>5的条件时,就开始准备画左侧树枝,这时右侧树枝已经右转20度(只转了角度未开始画),所以画左侧树枝需要左转40度,再调用tree(zhichang-15)函数本身,开始画树枝。
分析“双重递归”详细执行顺序_第4张图片
3、当左侧树枝也不能画时,开始执行返回节点:
分析“双重递归”详细执行顺序_第5张图片

因为当左侧树枝不能画时,角度偏向左20度,所以返回节点时需要先右转20度,再后退zhichang的长度。
图片

上面我们先简单分析了一下代码,下面重头戏来了!

二、我们一步步地看下,双重递归如何执行的,变量又是如何变化的。

1、主函数main()先为tree()函数传进一个实参40。

2、进入tree(zhichang)函数内部,zhichang为40大于5,接着向下执行,向前画40,向右转20度。调用tree(zhichang-15)函数,本应该是顺序向下执行“左侧树枝”和“返回节点”部分,但被tree(zhichang-15)截胡了一下,所以又要从头执行完此函数后再向下执行,这里,我们记一下:第一层 zhichang=40 还欠着“左侧树枝”和“返回节点”没运行。(步骤图中的第1步)

3、调用tree(zhichang-15),zhichang-15=25,满足>5,向前画25,右转20度,再调用函数本身tree(zhichang-15),同样,再记一下,第二层:zhichang=25, 再欠一次“左侧树枝”和“返回节点”没运行。(步骤图中的第2步)

4、再调用函数本身,25-15=10,满足>5,向前画10,右转20度。第三层:zhichang=10,又欠一次“左侧树枝”和“返回节点”没运行。(步骤图中的第3步)

5、当再次调用tree(zhichang-15)时,发现zhichang-15=-5,不满足>5的条件,无法再执行tree(zhichang-5),终于该还第三层的欠帐了,向下执行 “左侧树枝”和“返回节点”部分。进入“画左侧树枝”部分,向左转40度,此时又调用了tree(zhichang-15),发现zhichang-15=-5,所以tree(zhichang-15)不能被执行,再向下执行“返回节点”部分,右转20度,回退10。(步骤图中的第4步)

6、到这里,“左侧树枝”和“返回节点”运行过了,是不是程序执行完了呢?没有!我们前面的欠帐还没有还呢?我们该还第二层的帐了!在第二层里,zhichang=25。

7、执行第二层中的“左侧树枝”和“返回节点”:

(1)先向下执行第二层中的“画左侧树枝”:
左转40度,此时又调用tree(zhichang-15),zhichang-15=10,满足>5,向下执行,向前画10,右转20度(步骤图中第5步)。再次调用tree(zhichang-15),标记一下,第二层中的第一小层:zhichang=10, 欠“画左侧节点”“返回节点”未运行。接着看,zhichang-15=-5,不满足条件,不再执行tree(zhichang-15),开始还第二层第一小层的帐,向下执行“画左侧支点”代码,发现zhichang-15=-5,不再执行tree(zhichang-15),向下执行“返回节点”代码:右转20,后退10。(步骤图第6步)第二层第一小层的欠帐还完。

(2)接着还第二层的欠帐,运行“返回节点”代码,此时zhichang=25, 右转20度,后退25。(步骤图中的第7步)。第二层的帐还完。

8、下面开始还第一层的欠帐,执行“画左侧树枝”和“返回节点”代码,在第一层中zhichang=40。

(1)执行第一层中的“画左侧树枝”

左转40度,再调用tree(zhichang-15),zhichang-15=25>5,向前画25,右转20度。(步骤图中第8步),再调用tree(zhichang-15) ……,和还第二层的账类似,不再赘叙,经过一系列函数的自我调用。实现了步骤图中的9—13步。

(2)执行第一层中的“返回节点”代码,此时zhichang=40,右转20,后退40,回到分形树的起点了。(步骤图第14步)分形树绘制完毕。

双重递归比较绕,大家得耐下心来,理清调用关系。在这段代码里,以参数变量-15进行调用,所以变量由40递减为25 、10,达到最末端后,函数再一层层返回来,所以变量又从10、25、40返回回来。

你可能感兴趣的:(分析“双重递归”详细执行顺序)