文章目录
前言
今天,我们来学习一下方法的递归,希望我的讲解可以让您对方法的递归调用有更深的了解。
一、方法的递归调用是什么?
递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变 得简洁。
二、递归能解决什么问题呢?
1、各种数学问题如:八皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子的问题等等。
2、各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等。
3、将用栈解决的问题,代码实现变得更加简洁。
三、递归举例
举两个小案例来帮助大家理解递归调用机制。
1、打印问题
(1)代码如下
package Test01;
public class Test {
public static void main(String[] args) {
T t = new T();
t.test(4);//输出什么?
}
}
class T{
public void test(int n){
if(n>2){
test(n-1);
}
System.out.println("n="+n);
}
}
(2)运行结果=================================================
(3) 内存分析法
2、阶乘问题
(1)代码如下
public class Test {
public static void main(String[] args) {
T t = new T();
t.test(4);//输出什么?
int res = t.factorial(5);
System.out.println("5的阶乘res="+res);
}
}
class T{
public void test(int n){
if(n>2){
test(n-1);
}
System.out.println("n="+n);
}
public int factorial(int n){
if (n == 1) {
return 1;
}else {
return factorial(n-1)*n;
}
}
}
(2)运行结果
(3)内存分析
三、递归的重要规则
四、递归调用应用实例
public class MiGong {
public static void main (String args[]){
//创建一个迷宫 int map[][] = new int [8][]
int map [][] = new int [8][7];
//定义一个规则,1为不能过,0为能过
//第一行和最后一行为1
for(int i = 0;i<map.length;i++){
for(int j = 0;j<map[i].length;j++){
if(i == 0||i==7||j==0||j==6){
map[i][j] = 1;
}else {
map[i][j] = 0;
}
}
}
map[3][1] = 1;
map[3][2] = 1;
//迷宫设置完成
T aa = new T();
aa.findWay(map,1,1);
System.out.println("===================找路的情况");
for(int i = 0;i<map.length;i++){
for(int j = 0;j<map[i].length;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
}
class T {
public boolean findWay(int [][] map ,int i,int j){
//0 能走 1不能走 2能走 3死路
//初始位置在map [1][1]
//如果在 map [6][5] 为2,表示已经找到
if(map[6][5] == 2){
return true;
}else{
if(map[i][j] ==0){
map[i][j] = 2;
//找路策略,下,右,上,左
if(findWay(map , i+1 , j)){
return true;
} else if(findWay(map,i,j+1)){
return true;
} else if(findWay(map,i-1,j)){
return true;
} else if(findWay(map,i,j-1)){
return true;
} else {//上下左右 为 1 ,2,3
map[i][j] = 3;
return false;
}
}
}
System.out.println("n="+n);
return false;
}
}
今天的方法递归调用就暂时学到这里,往后我会继续更新。
总结
方法的递归调用主要就是明白是从哪里开始递,哪里开始归,注意方法递归中的细节(内存),栈与栈之间的关系,才是学习递归的重要方法。