首先我用举例子的方式,当它有两块时,三块时,四块时...不难发现,每一次去实现的时候,比如有四块,先把三块想办法移到除了自己原来在的那个杆(起始)和最终目标(目标)以外的那个(缓存)杆里面,然后把最底下的那块移到目标杆,然后再把之前在缓存杆里面的放到目标杆里。

更简单来说,比如说a里有1,2两个块,目标是c,那么b是缓存。所以

第一步  将1(a)移到b

第二步 将2(a)移到c

第三步 将1(b)移到c

括号里的是它现在所在的杆,为什么之前不用a,b,c来说,因为我感觉我就是被abc给绕晕的。

按照这个思想,当你有三块的时候

第一步  将1,2(a)移到b

第二步 将3(a)移到c

第三步 将1,2(b)移到c

我将1,2看成一个整体,就相当于它有两块,而利用递归的思想,1,2怎样移到b呢,用同一个函数,1,2又怎样从b移到c呢,用同一个函数。我在这样想时我就怎么样也找不出那个函数是什么样的,因为我在怎么列举,没有找到一个固定的规律,只找到了一种思想。但其实这就是我要找的所谓的规律。

(刚学完循环老是想找循环体)

递归就是让这种思想重复运用,这种思想我把它总结出来

第一步 起始 到 缓存

第二步 起始 到 目标

第三步 缓存 到 目标

那么第一个困惑的点就是因为每一次你去用这个思想时你的起始目标缓存的柱子各不相同比如说拿上面的三块举个例子,你要把1,2,3移到c,按照思想起始是a,缓存是b,目标是c。而在进行第一步把1,2移到b上时又得用一次这个思想,这时候就变成起始是a,目标是b,缓存是c。

你可以发现,起始永远不变,只不过会因为你块数的改变,你的缓存和目标会在b,c里变化,但可以肯定的一点是,你的最终目的的最后一步永远是将n-1个块放到b上。

第n步  a到b

第n-1步  a到c

等等

第 1 步   a到?

不管怎么样,你要想知道第一步怎么走,你必须从最后一步开始往前推,那么最后一步是什么已经知道了,剩下的计算留给计算机了,当计算机推完之后直到只剩一块的时候,你需要从第一步开始打印,比如说我算出来第一步是从a走到c,那么你就打印a-->c,这样我们可以这样设计函数以达到我们的目的

推导汉诺塔问题_斐波那契数列

每次我把第一个空叫做起始,第二个叫做缓存,第三个叫做目标,每次当我走到第一步时,我得把起始放到缓存里,而最后我要打印的是这时候谁在p3的位置,也就是谁在第三个空的位置,至此我们的第一步就这样设计完了。(这一步叫n-1块移到b上)

那么第二步就是起始移到目标,根据上面知道我们知道了最后一步是从a到c。

第三步同理,最后一步就是把n-1块从b放到c,完成我们的代码

推导汉诺塔问题_递归_02

那么当我们n一直递减到1的时候,在第一步的情况下放在p1的就是起始,放在p3的就是目标,这时候打印p1-->p3即可。

可以发现跟其他写的代码不太一样,我比较笨,老是会被a,b,c绕晕,所以就用p1,p2,p3代替,这样更容易理解一点。

另外讲一下自己走的弯路,我老是想探究这个代码怎么来的,于是老是想从第一步往前推,现在想想,递归应该是从最后一步开始往后推,让我想起了斐波那契数列,我感觉我每次探究的时候都推到第一项,其实没有必要,你只需要知道这个思想,它最后一步是干什么,电脑会自己往前推。到却要想想,什么时候停下来。

这就是全部内容,也是我初学递归的阶段性理解,希望以后能深入探究