方法递归调用

一、方法递归的基本介绍

  1. 简单来说,递归(recursion)就是方法自己调用自己,每次调用时传入不同的变量。
  2. 下面展示一个递归的基础案例:
// 打印问题(代码如下)
//代码说明:
// 当我们传入一个整数n时,就进入到if的判断语句,符合条件则又进入到test方法
//然后后面就一直重复之前的步骤,直到if语句不再成立。
 public void test(int n){
    if(n>2){
    test(n-1);
    }
    system.out.println("n="+n);
}

二、递归的重要规则

  1. 递归必须向退出递归的条件逼近,否则就会出现无限递归。
  2. 执行一个方法的时候,就创建一个新的受保护的独立空间(栈空间)
  3. 方法中的局部变量是独立的,不会相互影响。比如上面的变量n
  4. 如果方法中使用的是引用类型的变量(比如数组),就会共享该引用类型的数据
  5. 当一个方法执行递归完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

三、递归案例

三、1、阶乘问题

// 计算n的阶乘
//代码解析:
//       n的阶乘=1*2*3*...n;我们可以得知n是逐渐向1逼近的
//       因此我们就可以把n==1当作递归的结束条件
//       如果n不等于1,就继续调用factorial,直到n==1才退出递归
public void factorial(int n){
  if(n==1){
     return 1;
  }else{
     return factorial(n-1)*n;
}

三、2.斐波那契数

请使用递归的方式求出斐波那契数1,1,2,3,5,8,13......给你一个整数n,求出它的斐波那契数:
       题目分析:
       根据斐波那契数的规律我们可以知道
           1.当n=1时,n=1;
           2.当n=2时,n=1;
          3.当n>=3时,斐波那契数是前两个数的和
public class Fibonacci {
	public static void main(String[] args) {
		B b=new B();
		int n=7;
		int c=b.f(n);
		if(c==-1) {
			System.out.println("输入错误,需要输入>=1 的数字");
		}else {
		System.out.println("当n="+n+"对应的斐波那契数为"+c);
		}
	}

}

class B{
	public int f(int n) {
		if(n>=1) {
		if(n==1||n==2) {
			return 1;
		}else {
			return f(n-1)+f(n-2);
		}
	  }else {
		  return -1;
	  }
	}
}
上面的代码是用n=7来测试的
结果:
     当n=7对应斐波那契数为13

三、3.猴子吃桃

//有一堆桃子,猴子第一天吃其中的一半,并且再多吃一个!以后每天猴子都吃其中的一半,
然后再多吃一个。当到第10天的时候,想再吃的时候,发现桃子还剩1个。问最初桃子有多少个?
//代码解析:
//        n==10,peach10=1;
//        n==9,peach9=(peach10+1)*2=4;
//        n==8,peach8=(peach9+1)*2=10;
//        ......
//        上面可以看出,n==10就是递归的结束条件。
public int G(int n) {
		if(n==10) {
			return 1;
		}else if(n>=1 && n<=9){
			return (G(n+1)+1)*2;
		}else {
			System.out.println("n在0-9之间");
			return -1;
		}
	}
	

三、4.汉诺塔

问题:总共有a,b,c三个塔,a塔从下往上按大到小的顺序放着5(这里用5来举例)个盘子,每次只能移动一个盘子,要把a塔的所有盘子全放到c塔,问要怎么移动盘子?

public static void main(String[] args) {
        Tower tower = new Tower();
        int size=5;
        tower.move(size,'A','B','C');

    }
}

//把a塔上的所有盘子放到c盘上
class Tower{

    //写个方法
//    num表示要移动的个数,a,b,c分布表示a塔,b塔,c塔
    public void move(int num,char a,char b,char c){
//        如果只有一个盘 num=1
        if(num==1){
            System.out.println(a+"->"+c);
        }else {
//            如果有多个盘子,可以看成两个,最下面的和上面的所有盘子(num-1)
//            1.先移动上面的所有的盘子到b塔,期间要借助到c塔
            move(num-1,a,c,b);
//            2.把最下面的这个盘子移动到c塔
            System.out.println(a+"->"+c);
//            3.再把b塔的所有盘子移动到c塔,期间要借助到a塔
            move(num-1,b,a,c);
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值