浅谈如何写递归函数
来源:互联网 发布: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
- 浅谈如何写递归函数
- 如何写递归函数
- 如何写递归函数
- 如何写递归函数
- 浅谈如何写小说
- 如何写一个递归!
- 如何写递归
- 浅谈递归函数的设计
- 如何写一个递归程序
- 如何写好递归算法
- 如何设计递归函数?
- 浅谈PHP第四谈---递归函数
- 浅谈PHP第四弹---递归函数
- 如何写format函数
- 如何写函数
- 如何写memset函数
- 如何写mexFunction函数
- 拷贝函数如何写
- Java中的集合类图
- android numberpicker控件的布局在没有标题情况下设置3.0新样式方法
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- leetcode 之Longest Substring Without Repeating Characters
- 赠送 HttpClient 和HttpURLConnection 的轻型网络框架 ---》常见异常分析
- 浅谈如何写递归函数
- 粒子滤波
- 【BNUOJ】电网建设(MST,prim)
- test、
- node.js中的require
- Android多点触控技术实战,自由地对图片进行缩放和移动
- 一头栽下结束生命的鹰
- cocos2d-x --内存优化之使用16位纹理/NPOT
- java接口与内部类