白衣染霜花
首先我来解释一下汉诺塔的原理:当搬运的碟子数n=1时,直接搬运即可;当n>1时,要把n个碟子从针1搬运到针3,则必须通过针2(即需要一个独立于源针和目的针的中间针,用来辅助);假设我们已经成功的把上面较小的n-1个碟子搬运到了针2,那么我们只需要再把第n个碟子(底层最大的那个)搬运到针3,再把针2的n-1个碟子搬运到针3,那么这n个碟子塔就成功的搬运到了针3了.而整个n-1的塔要怎么搬运呢?这就是递归啦所以整个步骤:1.搬运n-1个碟子到中间针(递归)2.搬运第n个碟子到目的针3.搬运中间针的n-1个碟子到目的针(递归)void move (getone,putone)函数的作用是用于搬运最底层的第n个碟子,从getone针搬到putone针void hanoi (n,one,two,three)函数的作用是,把n层塔从one针(源)搬运到three针(目的),用two针来辅助(中间)所以上面的步骤就可以翻译成c语言了要想把n个碟子从one针搬运到three针的三个步骤:(与第一段陈述的三个步骤对应,即hanoi(n,one,two,three)函数要完成的功能,函数主体)1.hanoi(n-1,one,three,two);是递归调用,如果n-1>1则它又会去执行3个步骤,以至于无穷2.move(one,three);这一步是具体移动,所以要输出移动方法,让用户能看见移动方向3.hanoi(n-1,two,one,three);递归递归调用只要有整体观念就行了,你在写代码的过程中可以把"移动n-1个塔"看作一步完成的,至于这步是怎么完成的,会由计算机逐级递归展开函数栈具体实现,我们不必多想.因为每一级的过程都是一样的,所以用递归,减少代码规模递归的思想相对较容易,即只看见本层次,低层次由于过程和本层完全相同,调用递归函数自身,来重复利用代码.由于会函数嵌套调用会有多余的时间空间耗费,所以在递归次数过大等情况下,尽量用非递归的方法实现.