Java实现简单的递归操作⽅法实例
前⾔
在数据结构算法设计中,或者⼀个⽅法的具体实现的时候,有⼀种⽅法叫做“递归”,这种⽅法在思想上并不是特别难,但是实现起来还是有⼀些需要注意的。虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于⼀些⽐较抽象复杂的算法不⽤递归很难理解与实现。
递归分为直接递归和间接递归,就简单分享⼀下两个⼩的直接递归。
对于递归的概念,其实你可以简单的理解为⾃⼰定义⾃⼰,记得⼩时候看过⼀部电视剧《狼毒花》,⾥⾯主⾓叫做“常发”,但是个⽂盲,⽼师问他叫什么,他说“常发”。“哪个常?”“常发的常啊!”“哪个发?”“常发的发啊!”结果第⼆节课⽼师就让⼀群⼩朋友⼀起喊“常发的常,常发的发,傻⽠的傻,傻⽠的⽠”。⾔归正传,显然在多数情况下递归是解释⼀个想法或者定义的⼀种合理⽅法。在思想上递归类似于数学中曾经学过的数学归纳法。
递归的实现:
others是什么递归的实现要注意有两点:⼀个递归的选项和⼀个⾮递归的选项,后者成为基础情形(ba ca)。基础情形是递归的终结情形,没有基础情形或者处理不好都会导致⽆穷递归,这是我们不想要的结果。递highprofile
归实现起来最关键的是处理好基础情形。结合具体事例在说⼀下递归回溯的过程。
下边来写两个⼩程序:
1、爬楼梯算法:已知⼀个楼梯有n个台阶,每次可以选择迈上⼀个或者两个台阶,求⾛完⼀共有多少种不同的⾛法。
⽅法如下:
递归函数有返回值的⽐没有返回值的⿇烦⼀点,因为⼀个函数只有⼀个返回值,但是递归还要求有基础情形的存在,所以还必须有if判断来终⽌递归。所以在每⼀个if或者el后边都有⼀个return,这样保证函数在任何⼀种情况下都有且仅有⼀个返回值。
分析⼀下这个算法:
A:如果有0个台阶,那么有0种⾛法,这个不⽤多说;
B:如果有1个台阶,那么有1种⾛法;
C:如果有2个台阶,那么有2种⾛法(⼀次⾛1个,⾛两次;⼀次⾛两个);
以上的B和C就是基础情形。
D:接下来就是递归了,如果台阶数⽬多于2个,那么⾸先第⼀步就有两种选择:第⼀次⾛1个,或者第⼀次⾛两个。这样除了第⼀次后边的⾛法就有了两种情形:climbStairs(n-1)和climbStairs(n-2)。这样⼀直递归下去,直到出现到了基础情形(即n=1或n=2的情形),递归到这个地⽅(基础情形),然后开始回溯,这就是所说的和递归密切相关的“回溯”了。回溯,顾名思义就是从结果倒着回去,找到整个过程,进⽽分析这个路径或者说是实现的过程。
需要注意的是,这个算法实现思路上简单,但是复杂度并没有降低,还牵扯回溯保存堆栈问题(其实递归的设计尽量避免这种嵌套两个的递归⽅式(climb(n)中包含climb(n-1)和climb(n-2)),这种操作会使得堆栈开辟空间随着n的增⼤以指数型增长,最终程序很容易崩溃),⽽且在台阶数⽬多到⼀定数量的时候会越界(⾛法次数会超出int的范围),所以递归程序很⼤程度上就是思想实现设计上简单理解⼀些。
下边是源代码:
package leetcode;
public class ClimbStairs {
/
/ **************************************************************
scolapublic int climbStairs(int n) {
int i=1;
成都郫县卫校
if(n<=0)
return 0;
if(n==1){
return i;
}
if(n==2){
i++;
return i;
}
el
return climbStairs(n-1)+climbStairs(n-2);
}
//**************************************************************
public static void main(String []args){
ClimbStairs cs=new ClimbStairs();
int a =cs.climbStairs(4);
System.out.println(a);
}
}
心理学考研学校排名
然后还有⼏个⽐较典型的递归问题:⽐如说迷宫问题,或者最经典的汉诺塔问题,下边都给出源码,⼤家⼀块⼉学习⼀下。
汉诺塔问题:⼀次只能移动⼀个盘⼦;不能把⼤盘⼦放在⼩盘⼦上;除去盘⼦在两个柱⼦之间移动的瞬间,盘⼦必须都在柱⼦上。(在这三点要求下把盘⼦从起始柱⼦A全部移动到⽬标柱⼦C上)
代码如下:
基础情形:n==1的时候终⽌递归,进⾏回溯。
public class HanNuoTower {
public void tower(int n,char s,char m,char e)//n个塔从s经过m最终全部移动到e
{
if(n==1)
move(s,e);
el
{
tower(n-1,s,e,m);
move(s,e);
tower(n-1,m,s,e);
}
}
public void move(char s,char e){
System.out.println("move "+s+" to "+e);
}
public static void main(String []args){
HanNuoTower hnt =new HanNuoTower();
}
}
迷宫⾛法:⼆维数组构成⼀个迷宫,1表⽰通路,0表⽰不通,找到⼀条路径从起始点(traver函数的参数)到终点(右下⾓点)。
基础情形:row=grid.length-1&&column=grid[0].length-1时done=true;
public class Maze {
private final int TRIED=3;
private final int PATH=7;
private int [][] grid={ {1,1,1,0,0,1,0,1,0,0},
{0,0,1,1,1,0,0,0,0,0},
{1,0,1,0,0,0,1,1,1,1},
{1,1,1,1,1,0,0,0,1,1},
{0,0,0,0,1,1,1,0,0,0},
{1,0,1,0,1,0,0,1,0,0},
{1,0,0,1,1,1,1,1,1,1} };
public boolean traver(int row,int column){
boolean done =fal;
if(valid(row,column))
{
grid[row][column]=TRIED;
if(row==grid.length-1&&column==grid[0].length-1)
done=true;
el
{
done=traver(row+1,column);//down
if(!done)
done=traver(row,column+1);//right
if(!done)
done=traver(row-1,column);//up
if(!done)
done=traver(row,column-1);//left
}
if(done)
grid[row][column]=PATH;
cmbc}
return done;
}
private boolean valid(int row,int column){
boolean result=fal;
if(row>=0&&row<grid.length&&column>=0&&column<grid[row].length)
if(grid[row][column]==1)
result=true;
return result;
}
public String toString(){
String result="\n";
for (int row=0;row<grid.length;row++){
for(int column=0;column<grid[row].length;column++){
result +=grid[row][column]+" ";
}
result+="\n";
}真情永驻
return result;
}
高中毕业证丢了怎么办public static void main (String []args){
Maze maze=new Maze();
英语入门教程
System.out.println(maze);
aver(0, 0))
System.out.println("The maze was successfully travelled!");
el
System.out.println("There is no possible path.");
System.out.println(maze);
}
}
还有⼀个九连环的操作,有兴趣的话可以⼀起看看。生物燃料
总结
到此这篇关于Java实现简单的递归操作的⽂章就介绍到这了,更多相关Java递归操作内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!