浅谈如何写递归函数

来源:互联网 发布:mac itunes 12.7 铃声 编辑:程序博客网 时间:2024/06/06 18:38

浅谈如何写递归函数

写过一些递归函数,发现一些规律,分享一下吧,欢迎大神指教

编写递归函数总结

1.明确递归函数的参数列表,确定数据的存储方式

2.确定递归函数的结束条件,以及应该采取的方法,这些条件一般都放在函数的开头处,用于判断是否结束递归,很重要

3.找到递归的循环体,就是将那些会反复执行的语句找出来,

4.将循环体写在递归结束条件后面

5.over


下面就以一些例子来谈谈


以Java为下面的程序语言


一.汉诺塔问题,虽然都被讲烂了,但还是说一说

1.明确参数列表

汉诺塔这个问题的参数列表比较好找

参数:

碟子数 n

三个柱子的标记,分别标记为 A B C

那用什么数据类型呢?

当然是int 和char了


2.结束条件以及采取的方法

汉诺塔结束的条件就是当一个柱子上的碟子数为1时结束

结束时直接打印一条输出语句就行,就是将这个碟子移到目的柱子


3.怎么找循环体

汉诺塔的循环体就是

你要想将n个碟子从A移到C,

那必须先将n-1个碟子从A移到B,

再将一个碟子从A移到C,

然后将n-1个碟子从B移到C


你要想将n-1个盘子从A移到B.......后面就循环了


4接下来就是代码了


public class hannuo{static int count;//统计总次数public static void main(String[] args){HN(10,'A','B','C');System.out.println("总移动次数为:"+count);}public static void HN(int n,char begin,char mid,char end){if(n==1){System.out.println("将碟子从"+begin+"移到--------->"+end);count++;return;}HN(n-1,begin,end,mid);System.out.println("将碟子从"+begin+"移到--------->"+end);count++;HN(n-1,mid,begin,end);}}


下面还有一个走迷宫的代码,也是用递归写的,基本上也是按照上面这个套路写的


上代码

//import java.util.*;public class Maze{static int MAX_ROW=10;static int MAX_COLUMN=10;static boolean flag=false;public static void main(String[] args){int[][] arr=new int[][]{{1,1,0,0,0,0,0,0,0,0},{0,1,1,1,1,1,1,1,0,0},{0,0,0,1,0,0,0,1,0,0},{0,0,0,1,1,1,0,1,0,0},{0,0,0,0,0,1,0,1,1,1},{1,1,1,0,0,1,0,0,0,1},{1,0,1,0,1,1,0,0,0,1},{1,0,1,1,1,0,1,1,1,1},{1,0,0,0,0,0,0,0,0,0},{1,1,1,1,1,1,1,1,1,1}};int[] beginCoordinate={0,0};//第一个表示行,第二个表示列int[] endCoordinate={9,9};System.out.println("一开始的迷宫,1代表有路,0代表没路");System.out.println("\n\n起始坐标("+beginCoordinate[0]+","+beginCoordinate[1]+")"+"           结束坐标("+endCoordinate[0]+","+endCoordinate[1]+")");printarr(arr);solve(arr,beginCoordinate[0],beginCoordinate[1],endCoordinate);if(!flag)System.out.print("没有找到走出迷宫的路");}public static void solve(int[][] arr,int row,int column,int[] endCoordinate){//判断是否到达了终点if(row==endCoordinate[0] && column==endCoordinate[1]){flag=true;//找到了出口,将flag改为trueSystem.out.println("走出迷宫的路为");printarr(arr);return;}//判断是否不能继续走下去if(check(arr,row,column)){arr[row][column]=-2;//将错误的路线上的数变成-2int[] re=getReturn(arr,row,column);row=re[0];column=re[1];solve(arr,row,column,endCoordinate);return;}//如果当前行的下一格满足条件,向下一格走if(column+1<MAX_COLUMN && row <=MAX_ROW && arr[row][column+1]==1){arr[row][column+1]=7;solve(arr,row,column+1,endCoordinate);}//如果当前列的下一格满足条件,向下一格走if(column<MAX_COLUMN && row+1<MAX_ROW && arr[row+1][column]==1){arr[row+1][column]=7;solve(arr,row+1,column,endCoordinate);}//如果当前行的前一格满足条件,向前走if(column-1>=0 && row<MAX_ROW && arr[row][column-1]==1){arr[row][column-1]=7;solve(arr,row,column-1,endCoordinate);}//如果当前列的上一格满足条件,向上走if(row-1>=0 && column<MAX_COLUMN && arr[row-1][column]==1){arr[row-1][column]=7;solve(arr,row-1,column,endCoordinate);}}//检查是否没路了public static boolean check(int[][] arr,int row,int column){if(row==0 && column==0)return false;int count=0;if(check(row-1,column,arr))count++;if(check(row+1,column,arr))count++;if(check(row,column+1,arr))count++;if(check(row,column-1,arr))count++;if(count==1)return true;return false;}//检查当前格子周围的格子是否满足条件public static boolean check(int row,int column,int[][] arr){if(row<0 || row>=MAX_ROW|| column<0 || column>=MAX_COLUMN)return false;if(arr[row][column]>0)return true;return false;}//输出二维数组public static void printarr(int[][] arr){System.out.println("|------------------------------------------------------->x轴");for(int[] ss:arr){System.out.print("| ");for(int dd:ss){System.out.print(dd+"\t");}System.out.println("");}for(int i=0;i<4;i++)System.out.println("| ");System.out.println("y轴");}//当没路时,通过这个方法获得自己上一个的格子的行和列public static int[] getReturn(int[][] arr,int row,int column){int[] re=new int[2];if(check(row-1,column,arr)){re[0]=row-1;re[1]=column;return re;}if(check(row+1,column,arr)){re[0]=row+1;re[1]=column;return re;}if(check(row,column+1,arr)){re[0]=row;re[1]=column+1;return re;}if(check(row,column-1,arr)){re[0]=row;re[1]=column-1;return re;}return re;}}

写的不好别喷我



0 0