java04.方法递归算法总结

目录

1.方法递归概念

1.1递归的定义:

1.2递归的形式:

1.3递归的注意:

2.递归算法三要素⭐️⭐️

3.递归案例

1.猴子🐒吃桃子🍑

2.阶乘问题

3.输入一个非负整数,返回组成他的数字之和

如输入1729,则返回1+7+2+9=19

4.求斐波那数列的第n项

5.啤酒问题(无规律递归)


1.方法递归概念

1.1递归的定义:

  • 方法调用自身的形式。

1.2递归的形式:

  1. 直接递归:方法自己调用自己
  2. 间接调用:方法a调用方法b,方法b调用方法c,方法c调用方法a

1.3递归的注意:

  1. 递归死循环:条件限定出错,导致递归没有控制好终止,出现递归死循环,造成StackOverFlowerError
  2. 递归次数太多,导致StackOverFlowerError
  3. 构造方法不能使用递归算法。

2.递归算法三要素⭐️⭐️

  1. 递归的功能(题意)推 递归函数
  2. 寻找递归终止条件
  3. 递归方向必须走向递归总结点

3.递归案例

1.猴子🐒吃桃子🍑

猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了 第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个以后每天都是吃前天剩余桃子数量的一半,觉得好不过癮,又多吃了一个等到第10天的时候发现桃子只有1个了。

需求:请问猴子第一天摘了多少个桃子?

分析题意:day:1到10;last=1;求num0(即  F(1))

递归函数:F(day+1)=F(day)/2-1.   简化为:F(day)=F(day+1)*2+2

递归终止条件:day==10  求 F(10)

递归方向:day由1到10

import java.util.*;
public class main {
	
	public static void main(String[] args) {
		
		// TODO Auto-generated method stub
		System.out.println("The first day's number is "+fun(1));
	}
	private static int fun(int day) {
		
		if(day==10) {
			return 1;
		}else {
			return fun(day+1)*2+2;
		}
	}
}
   //输出:The first day's number is 1534

2.阶乘问题

public class main {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println(n+"的阶层等于 "+fun(n));
	}
	private static int fun(int n) {
		
		if(n==1) {
			return 1;
		}else {
			return fun(n-1)*n;
		}
	}
}
//输入:5
//输出:5的阶层等于 120

3.输入一个非负整数,返回组成他的数字之和

如输入1729,则返回1+7+2+9=19

public class main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println(n+"数字之和为 "+fun(n));
	}
	private static int fun(int n) {
		
		if(n%10==0) {
			return n;
		}else {
			return fun(n/10)+n%10;
		}
	}
}

//输入:12345
//输出:12345数字之和为 15

4.求斐波那数列的第n项

例如:1 1 2 3 5 8 13 21

import java.util.*;
public class main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println("斐波那数列的第"+n+"为 "+fun(n));
	}
	private static int fun(int n) {
		
		if(n==1||n==2) {
			return 1;
		}else {
			return fun(n-1)+fun(n-2);
		}
	}
}
 
//输入:7
//输出:斐波那数列的第7为 13

5.啤酒问题(无规律递归)

需求:啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,

请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。 答案:15瓶3盖子1瓶子

public class Demo3 {
    //定义静态成员变量进行统计最后买的啤酒,默认为0
    public static int totalNumber;     //记录买的啤酒
    public static int totalButtle;    //记录上次剩余的瓶子个数
    public static int totalCover;    //记录上次剩余的盖子个数
    public static void main(String[] args) {
        buy(10);
    }
    /**
     * 进行买啤酒
     * @param money
     */
    private static void buy(int money) {
        int buyNumber = money/2;
        totalNumber += buyNumber;

        //记录当前的瓶子个数、盖子个数
        int buttle = totalButtle + buyNumber;
        int cover = totalCover + buyNumber;

        //将当前的瓶子和盖子转换为金钱,利用递归再次购买啤酒
        int allMoney = 0;
        //先判断瓶子和盖子的个数是否满足可以兑换的数量,
        if (buttle >= 2){
            allMoney += (buttle/2) * 2;
        }
        if (cover >= 4){
            allMoney += (cover/4) * 2;
        }
        
        //并计算当前剩余的瓶子和盖子的数量
        totalButtle = buttle % 2;
        totalCover = cover % 4;

        //进行判断是否进行递归操作
        if (allMoney >= 2){
            buy(allMoney);
        }else {
            System.out.println(totalNumber+"瓶酒\t\t"+totalButtle+"个瓶子\t\t"+totalCover+"个盖子");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值