**一.**汉诺塔问题时一个金典问题,无论在c++中或是java中,汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。
问应该如何操作?
这个问题理解下来就是:要把柱子A上的圆盘全部移动到柱子C,且小盘子上不能放大盘子,一次只能移动一个盘子。
假如在柱子A上有1个盘子,则只需要将盘子1号直接移动到柱子C;
假如在柱子A上有2两个盘子从上往下为一号和二号,则需要先将柱子A上的盘子1移动至柱子B,再将盘子2号移动至柱子C,最后将柱子B上的盘子1移动至柱子C;
假如在柱子A上有n个盘子呢?我们只需要将上面的(n-1)个盘子移动到柱子B,再将第n个盘子(最底下最大的盘子)移动到柱子C;这里用递归就很好解决了,(n-1)个盘子移动到柱子B时,柱子C作为辅助移动的柱子;把第n个盘子移动到柱子C后,柱子A作为一个辅助的柱子。代码如下:
public static void hanNuota(int i,char a,char b,char c){
if(i==1){
System.out.println("从"+a+"移动"+i+"号到"+c);
}
else{
hanNuota(i-1,a,c,b);
System.out.println("从"+a+"移动"+i+"号到"+c);
hanNuota(i-1,b,a,c);
}
public static void main(String[] agrs){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第几个数:");
int i=scanner.nextInt();
hanNuota(i,'A','B','C');
}
}
运行结果:
**二.**青蛙跳台阶问题:一只青蛙一次可以跳上 1 级台阶,也可以一次跳上2级台阶,求该青蛙跳上一个n级的台阶有多少种跳法?
这个问题使用递归很简单,首先:
假如台阶只有1级,所以青蛙只有一种跳法;
假如台阶有2级,所以青蛙有两种跳法;
假如台阶有3级,青蛙有三种跳法;
假如台阶有4级,青蛙就有五种跳法;
…
假如有n级,青蛙就有(n-1)级的所有跳法加上(n-2)级的所有跳法。
1 1;
2 2;
3 3;
4 5;
…
n (n-1)+(n-2);
通过举例很明显的发现了规律,从第三级台阶开始,台阶数每增加1级,跳法就等于前台阶数的跳法加上前一级的再前一级的台阶数的跳法。由此可见,从第三级开始,相当于一个斐波那契数列。代码如下;
public static int taiJie(int i){
if(i<0){//没有台阶时0种跳法
return 0;
}
else if(i==1){//只有1级台阶时,只有一种跳法
return 1;
}
else if(i==2){//有2级台阶时有两种跳法
return 2;
}
else{
return taiJie(i-1)+taiJie(i-2);
}
}
public static void main(String[] agrs){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第几个数:");
int i=scanner.nextInt();
System.out.println(taiJie(i));
}
}
运行结果:10级时有多少种跳法: