我不懂得汉诺塔函数递归,希望大家能逐行分析一下下面图片的代码,谢谢大家
就是一个递归嘛
调用hanoi(3,a,c,b)
n = 3,执行else下面的语句,调用自己,2和其他参数传进去(c和b位置换了,a,b,c)
n = 2,执行else下面的语句,调用自己,1和其他参数传进去(b和c位置换了,a,c,b)
n = 1,执行if下面的语句,输出1,a,c,count+1
输出2,a,b,,count+1,调用自己,1和其他参数传进去(a和c位置换了,c,b,a)
n = 1,执行if下面的语句,输出1,c,b,count+1
输出3,a,c,count+1,调用自己,2和其他参数传进去(a和b位置换了,b,c,a)
n = 2,执行else下面的语句,调用自己,1和其他参数传进去(c和a位置换了,b,a,c)
n = 1,执行if下面的语句,输出1,b,a,count+1
输出2,b,c,count+1,调用自己,1和其他参数传进去(b和c位置换了,a,c,b)
n = 1,执行if下面的语句,输出1,a,c,count+1
输出 7
其实要参透的是为什么要这样递归吧?
递归的思想,就是把大的问题拆解成小问题,直到不能再拆解。汉诺塔的例子就是这样。
1)如果只有一个圆盘(n=1),则只要把圆盘从A挪到C位置即可。这种一个圆盘的情况可以标记为hanoi(1)
2)如果有两个圆盘(n=2),则要把2号圆盘先从A挪到B,然后就相当于只有一个圆盘了,于是执行hanoi(1),把最大的1号圆盘从A挪到C,最后,再把2号圆盘从B挪到C。
3)如果有三个以上的圆盘(n>=3),则要想办法先把2号3号乃至更多的圆盘从A挪到B,只剩下一个圆盘的情况,执行hanoi(1),最后再把2号3号从B挪到C。仔细观察就可以发现,把2号3号乃至更多的圆盘从A挪到B,再从B挪到C的这两个步骤,又可以分别递归成 hanoi(n-1) 的情况。
所以,总结一下,写成代码,当n>=2的时候,都要执行3步就可以了,
第一步:把最大的圆盘之上的所有圆盘从A挪到B (hanoi(n-1,src,mid,dst))
第二步:把最大的圆盘从A挪到C(hanoi(1))**这里没有递归,而是把n=1的代码重新写了一遍
第三步:把其他的所有圆盘从B挪到C(hanoi(n-1,mid,dst,src))