当前位置: 首页 > 科技观察

Java编程内功——数据结构与算法“递归”_0

时间:2023-03-12 22:46:48 科技观察

概念很简单:递归是一种调用自身的方法,每次调用时传入不同的变量。递归帮助程序员解决复杂的问题,同时使代码整洁。递归可以解决什么样的问题?数学问题如:八皇后问题、汉诺塔问题、阶乘问题、迷宫问题、球和篮子问题(谷歌编程竞赛)。递归也用在各种算法中,比如快速排序、归并排序、二分查找、分治算法等。用栈解决的问题->递归代码比较简洁。当一个方法按照递归规则执行时,会创建一个新的受保护的独立空间(栈空间)。方法的局部变量是独立的,不会互相影响。如果方法中使用的变量是引用类型的变量(如数组),则引用类型的数据将被共享。递归必须逼近退出递归的条件,否则就是无限递归。当一个方法执行的时候,或者遇到return的时候,它就会return,结果会返回给调用它的人。同时,当方法执行或返回时,方法也会被执行。递归回溯解决了迷宫问题。在二维数组中,1代表墙,求小球从指定点到终点所走的路径.packagecom.structures.recursion;publicclassMiGong{publicstaticvoidmain(String[]args){//先创建一个二维数组模拟迷宫,mapint[][]map=newint[8][7];//用1代表墙,和设置迷宫的上、下、左、右为1for(inti=0;i<7;i++){map[0][i]=1;map[7][i]=1;}for(inti=0;i<8;i++){map[i][0]=1;map[i][6]=1;}//设置挡板map[3][1]=1;map[3][2]=1;//输出图System.out.println("原图");for(inti=0;i<8;i++){for(intj=0;j<7;j++){System.out.print(map[i][j]+"");}System.out.println();}//使用递归回溯寻路setWay(map,1,1);System.out.println("策略走过的路径");for(inti=0;i<8;i++){for(intj=0;j<;7;j++){System.out.print(map[i][j]+“”);}system.out.println();}/*111111111111111111000001111111111111111111111111111110000011100000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111M转***使用递归回溯找路。如果能映射到[6][5]位置,就说明路径已经找到了。*约定:当map[i][j]为0时表示该点未通过,为1时表示墙,为2时表示路径可以走,3意思是该点已经过了,但是过不去*走迷宫的时候需要确定一个策略(方法),down->right->up->left,如果过不去,goback**@parammap表示地图*@parami从哪个位置开始行坐标*@paramj从哪个位置开始列坐标*@return如果找到路径,返回true,否则返回false*/publicstaticbooleansetWay(int[][]map,inti,intj){if(map[6][5]==2){returntrue;}else{if(map[i][j]==0){//如果当前点有notpassed//根据策略Down->Right->Up->Leftgomap[i][j]=2;//假设点可以通过if(setWay(map,i+1,j)){//往下走returntrue;}elseif(setWay(map,i,j+1)){//向右走returntrue;}elseif(setWay(map,i-??1,j)){//向右走returntrue;}elseif(setWay(map,i,j-1)){//向左走returntrue;}else{map[i][j]=3;//表示这个点是死胡同,returnfalse;}}else{//如果map[i][j]!=0,表示可能是1,2,3returnfalse;}}}}八皇后问题在8*8的棋子上放置8个皇后,使其不能互相攻击,即:any两个皇后不能在同一行,同一列,同一斜线,有多少种摆。理论上应该创建一个二维数组来表示棋盘,但实际上可以通过算法使用一维数组来解决问题。arr[8]={0,4,7,5,2,6,1,3},对应的arr下标表示是第几行,即第哪个皇后,arr[i]=val,val表示第i+1个皇后,放在第i+i行的val+1列.packagecom.structures.recursion;publicclassQueen8{//表示有多少个皇后privateintmax=8;//定义数组数组保存皇后放置的结果,例如arr[8]={0,4,7,5,2,6,1,3}privateint[]array=newint[max];staticintcount=0;publicstaticvoidmain(String[]args){Queen8queen8=newQueen8();queen8.check(0);System.out.printf("一共排了%d\n",count);//92种}//放第n个皇后publicvoidcheck(intn){if(n==max){//n=8表示print();count++;return;}//依次放入皇后,判断是否冲突for(inti=0;i