汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 设移动n个盘子的汉诺塔问题需要g(n)次移动操作来完成。由展示移动过程算法可知g(n)应是三部分之和。 (1) 将n个盘上面的n-1个盘子借助C桩从A桩移到B桩上,需g(n-1)次移动; (2) 然后将A桩上第n个盘子移到C桩上(1次); (3) 最后,将B桩上的n-1个盘子借助A桩移到C桩上,需g(n-1)次。 因而有递归关系: g(n)=2*g(n-1)+1 初始条件(递归出口): g(1)=1 即 1、3、7、15、31。。。即g(n) = 2^n -1
#include<iostream> using namespace std; int move(int n, char a, char b, char c){ int mm=0, pp=0; if(n==1){ cout<<"盘"<<n<<" 从"<<a<<"移动到"<<c<<endl; return 1; } else{ mm = move(n-1, a, c, b); cout<<"盘"<<n<<" 从"<<a<<"移动到"<<c<<endl; mm+=1; pp = move(n-1, b, a, c); } return mm+pp; } int main(){ int n=4; cout<<"共移动了"<<move(4, 'a', 'b', 'c')<<endl; }
递归执行
package face1;
/**
@author Administrator
/
public class Hanoi {
public static int i=0;
public static void HanoiTower(int n,char A,char B,char C){
if(n
throw new IllegalAccessError("n必须小于1!");
}
if(n==1) {
System.out.println(A+"->"+B);
}else{
HanoiTower(n-1, A, C, B); //将除过最大的盘子n个盘子,从A通过B移动到C
System.out.println(A+"->"+B);//将最大的盘子从A移动到B
HanoiTower(n-1, C, B, A);//将出去最大的盘子的n-1个盘子从C通过A移动到B
}
}
public static void main(String[] args) {
HanoiTower(4, 'A','B', 'C');
System.out.println(i);
}
}