目录
1.方法递归概念
1.1递归的定义:
- 方法调用自身的形式。
1.2递归的形式:
- 直接递归:方法自己调用自己
- 间接调用:方法a调用方法b,方法b调用方法c,方法c调用方法a
1.3递归的注意:
- 递归死循环:条件限定出错,导致递归没有控制好终止,出现递归死循环,造成StackOverFlowerError
- 递归次数太多,导致StackOverFlowerError
- 构造方法不能使用递归算法。
2.递归算法三要素⭐️⭐️
- 由递归的功能(题意)推 递归函数
- 寻找递归终止条件
- 递归方向必须走向递归总结点
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+"个盖子");
}
}
}