Java方法递归

方法递归

1.什么是方法递归

​ 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion)。递归做为一种算法程序设计语言中广泛应用。

2.递归的形式

2.1直接递归:方法自己调用自己

2.2间接递归:方法调用别的方法,别的方法又回调自己

3.方法递归存在的问题

递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出现象。

递归案例

案例一:计算1~n的阶乘

public class oneTon {
    public static void main(String[] args) {
        System.out.println(f(5));
    }
    public static int f(int n){
        if (n==1){
            return 1;
        }else {
            return f(n-1)*n;
        }
    }
}

运行截图
在这里插入图片描述

案例二:猴子吃桃问题

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

/**
 * f(x)-f(x)/2-1=f(x+1)
 * 2f(x)-f(x)-2=2f(x+1)
 * f(x)=2f(x+1)+2
 * @author JiaShuai
 * @date 2022/4/16 22:36
 */
public class Digui {
    public static void main(String[] args) {
        System.out.println(f(1));
    }
    public static int f(int n){
        if (n==10){
            return 1;
        }else {
            return 2*f(n+1)+2;
        }
    }
}

运行截图
在这里插入图片描述

非规律化案例1:文件搜索

文件搜索、从D:盘中,搜索出某个文件名称并输出绝对路径。

public class SearchFile {
    public static void main(String[] args) {
        searchFile(new File("D:/"),"收集Stream流.png");
    }
    public static void searchFile(File dir,String fileName){
        if (dir!=null&&dir.isDirectory()){
            File[] files=dir.listFiles();
            if (files!=null&&files.length>0){
                for (File file : files) {
                    if (file.isFile()){
                        if (file.getName().contains(fileName)){
                            //是文件输出文件位置
                            System.out.println("文件路径为:"+file.getAbsolutePath());
                        }
                    }else {
                        //是文件夹,使用递归继续找
                        searchFile(file,fileName);
                    }
                }
            }
        }else {
            System.out.println("查找错误!!!");
        }
    }
}

运行截图
在这里插入图片描述

非规律化案例2:啤酒问题

需求:啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元钱可以喝多少瓶酒,剩余多少空瓶和盖子。

public class Maijiu {
    public static int totalNumber; // 总数量
    public static int lastBottleNumber; // 记录每次剩余的瓶子个数
    public static int lastCoverNumber; // 记录每次剩余的盖子个数
    public static void main(String[] args) {
        buy(10);
        System.out.println("总数:" + totalNumber);
        System.out.println("剩余盖子数:" + lastCoverNumber);
        System.out.println("剩余瓶子数:" + lastBottleNumber);
    }

    //买酒
    public static void buy(int money){
        // 可以直接买多少瓶
        int buyNumber = money / 2;
        totalNumber += buyNumber;
        // 把盖子 和瓶子换算成钱
        // 统计本轮总的盖子数  和 瓶子数
        int coverNumber = lastCoverNumber + buyNumber;
        int bottleNumber = lastBottleNumber + buyNumber;

        // 统计可以换算的钱
        int allMoney = 0;
        if(coverNumber >= 4){
            allMoney += (coverNumber / 4) * 2;
        }
        lastCoverNumber = coverNumber % 4;

        if(bottleNumber >= 2){
            allMoney += (bottleNumber / 2) * 2;
        }
        lastBottleNumber = bottleNumber % 2;

        if(allMoney >= 2){
            buy(allMoney);
        }
        Integer[] arr2 = new Integer[]{11, 22, 33};
        Arrays.sort(arr2);
    }
}

运行截图
在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小唐僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值