貌似是基础测试or入学测试题?老规矩,只给思路不给代码。
这道题是非常典型的递归,但不复杂,很直观。
比如要把5个盘子从1号柱子移动到3号柱子,步骤是:
把1-4号共4个盘子移到2号柱子
把5号共1个盘子移到3号柱子
把1-4号共4个盘子移到3号柱子
显然,如果把“从m号柱子按从小到大顺序移动k个盘子到n号柱子,p号柱子作为备用”定义为一个函数move(k,m,n,p),那么move(5,1,3,2)函数中就要依次递归调用move(4,1,2,3) move(1,1,3,2) move(4,2,3,1)
化为一般形式,也就是在move(k,m,n,p)函数体中要依次递归调用move(k-1,m,p,n) move(1,m,n,p) move(k-1,p,n,m)
递归函数还必须有一个base case,也就是不再依赖递归的情形,本题中,显然“从m号柱子按从小到大顺序移动1个盘子到n号柱子,p号柱子作为备用”是base case,因为只要移动一个盘子,直接打印出来将盘子从m移动到n即可
完毕 |