二、累次迭代
我们以一个例子来介绍“累次迭代”.下面的例子(如图37)是比较经典的累次迭代的例子,画板都可以做,这个例子在网络画板赛第31期中介绍过,当时的问题是有些计算非常复杂,让人望而生畏.那么有没有计算量很小又能得到这个图形的办法呢?答案是有的,可以利用“累次迭代”的办法,这个办法的优点是实现比较简单,可以说几乎没有什么计算.

图37 累次迭代图
在上例中,变量a表示每一块砖的长,变量b表示每一块砖的宽,变量h表示每一堆砖块之间的间距,变量i,j,k分别表示累次迭代的最外层、中间层、最内层迭代的迭代变量.
接着我们来分析一下这张图的结构.
1.最外层可以看成有i堆(如图38);

图38 累次迭代图堆数图
2.某一堆又可以看成有j层(如图39):

图39 累次迭代图每堆层数图
3.某一层又可以看成有k块(如图40).

图40 累次迭代图每层位置图
据此分析,可以考虑累次迭代,而且总共分3次迭代,并且需要从内而外依次迭代,也就是说必须先迭代生成某一层,然后再迭代生成某一堆,最后再迭代生成整个图形.但是,在“迭代原理”部分中说过,要能产生迭代象,迭代的对象必须是原象的子对象,所以在真正迭代的时候我们必须反过来,先利用最外层的迭代变量i生成一个点B,然后利用这个点B结合中间层的迭代变量j再生成一个点C,最后利用这个点C结合最内层迭代变量k来生成一个点D.这样,就形成了一个父子链:变量i→点B(由变量i控制)→点C(由变量j控制)→点D(由变量k控制).接着,再反过来构造迭代,用变量k作为原象对点D进行迭代生成迭代象1(即某一层),然后再用变量j作为原象对迭代象1进行迭代生成迭代象2(即某一堆),最后再利用变量i作为原象对迭代象2进行迭代生成迭代象3(即全部图形).
具体步骤如下:
1.创建一个自由点A,用于控制整个图形的位置,再把点A向右平移m3个单位得到点B;再把点B向右平移m4个单位,向上平移m5个单位得到点C;最后把点C向右平移m6个单位得到点D(如图41).

图41 新建变量和测量计算
2.把点D分别向右平移a个单位,向上平移b个单位,向右上方平移(a,b)个单位得到三个点,以这四个点为顶点构造矩形(如图42).(https://www.daowen.com)

图42 构造矩形
3.对变量k作为原象进行迭代,迭代深度为i-j+1,迭代的象为构造的矩形(如图43).

图43 对变量k进行迭代
4.对变量j作为原象进行迭代,迭代深度为i+1,迭代的象为之前的迭代象1(如图44).

图44 对变量j进行迭代
5.对变量i作为原象进行迭代,迭代深度是n,迭代的象为上一步生成的迭代象2(如图45).

图45 对变量i进行迭代
6.最后调整所有变量的初始值:i,j,k的初始值都是-1,a,b,h的初始值可自己设定,隐藏不必要的对象,保留最后一次的迭代象3(如图46).

图46 调整变量的初始值
这个方法有个小问题,即在计算每一堆之间的间隔时,计算式m3相对来说有点复杂.其实也不难理解,因为每一堆随着i值的增加,最底层的砖块数量从1+2+3+…+n,所以才会有m3的表达式.那么,能不能把m3的表达式化得更简单些呢?答案是肯定的.

图47 调整变量的初始值
如图47,m3的表达式做了简化,但却出现另一个小问题,就是整个图形的左下角不能和点A始终重合,不像上面的方法,图形的左下角始终和点A重合.
总结:要实现累次迭代,主要是要生成一个形如这样的一个父子链:
