🎈前言:汉诺塔问题与青蛙跳台阶问题是编程学习中递归知识的两个经典难题,想要真正掌握递归,对这两大难题的通透理解必不可少 ! 下面博主就来讲解这两大难题 :
一 . 青蛙跳台阶问题
问题 :一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
由题意可以画出跳上前4节台阶的各种情况,推理可知,跳上N个台阶的总共方法为跳上N-1个台阶的方法数量+跳上N-2个台阶的方法数量,由此作为递归代码书写的思路,递归出口即为跳上1个台阶是1种方法,由此可以写出递归代码如下:
(青蛙跳台阶问题类似于求斐波那契数列,只是第二项变为2,而不是1)
public static int fogJump(int n){ //递归实现
if(n==1 || n==2){
return n;
}
return fogJump(n-1)+fogJump(n-2);
}
//循环迭代实现,效率高很多
public static int fogJump2(int n){
if(n==1 || n==2){
return n;
}
int f1=1;
int f2=2;
int f3=0;
for (int i = 3; i <= n ; i++) {
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
public static void main12(String[] args) {
System.out.println(fogJump(4));
System.out.println(fogJump2(4));
}
二.汉诺塔问题
问题 : 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。
问应该如何操作?
思路:实现盘子的移动都需要对N-1数量的盘子先进行移动,先放到中转位置上,再把最下面那个大盘子放到最终位置上,继续接下来的操作,N-1数量的盘子继续第一步操作,通过中转位置,递归实现,出口即为N=1时候,直接从起始位置移动到最终位置即可,代码如下:
(规律 : 需要次数为2^N-1次,N为盘子数量)
// 汉诺塔问题
public static void move(char pos1,char pos2){
System.out.print(pos1+"->"+pos2+" ");
}
/**
*
* @param n 代表要移动的盘子的数量
* @param pos1 代表盘子所在的起始位置
* @param pos2 盘子所在的中转位置
* @param pos3 盘子所在的结束位置
*/
public static void hanio(int n,char pos1,char pos2,char pos3){
if(n==1){
move(pos1,pos3);
}else{
hanio(n-1,pos1,pos3,pos2);
move(pos1,pos3);
hanio(n-1,pos2,pos1,pos3);
}
}
public static void main(String[] args) {
hanio(4,'A','B','C');
System.out.println();
}
(Ps:这样就可以实现题目中的64个盘子的移动了,只是次数十分庞大,对计算机来说也是一个难题了…)
工作量十分巨大…😪
结尾
递归两个难题到此就讲解完毕,如果觉得文章对自己有帮助的话,欢迎大家多多点赞收藏~ 🥰