方法递归调用

本文介绍了Java中的方法递归,包括直接和间接递归的形式,并通过阶乘计算、猴子吃桃问题等案例解析递归算法的流程和核心要素。此外,还讨论了文件搜索的递归实现和啤酒问题的递归解决方案,强调了算法在编程面试中的重要性,并推荐了牛客网作为刷题平台。
摘要由CSDN通过智能技术生成

🏡个人主页 :@ 守夜人st
🚀系列专栏:Java
…持续更新中敬请关注…
🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点

✈️推荐一款模拟面试,刷题神器,从基础走向大场面试👉 开启你的刷题之路吧

方法递归

递归的形式和特点

什么是方法递归

  • 方法直接调用自己或者间接调用自己的形式成为方法递归(recursion)
  • 递归作为有一种算法在程序设计语言中广泛应用

递归的形式

  • 直接调用:方法自己调用自己
  • 间接调用:方法调用其他方法,其他方法又返回调用自己
package com.shouyeren.algorithm.recursion;

/**
 * 递归的形式
 */
public class recursionDemo1 {
    public static void main(String[] args) {
        test();
        test1();
    }

    public static void test(){
        System.out.println("test方法被执行了");
        test();//方法递归 直接递归形式
    }

    public static void test1(){
        System.out.println("test方法被执行了");
        test2();//方法递归 间接递归形式
    }

    public static void test2(){
        System.out.println("test方法被执行了");
        test1();
    }
}

递归的方法无限调用自己,无法终止,会出现StackOverflowError 堆栈溢出错误

递归的算法流程、核心要素

案例

需求:计算1—n的阶乘的结果,使用递归思想解决,从数学思维上理解递归的流程和核心点

package com.shouyeren.algorithm.recursion;

/**
 * 递归的算法和执行流程
 */
public class recursionDemo2 {
    public static void main(String[] args) {
        System.out.println(test(5));//120
    }

   public static int test(int n){
        if (n == 1){
            return 1;
        }else {
            return test(n - 1) * n;
        }
   }
}

递归解决问题的思路

  • 把一个复杂的问题层次转化为一个与原问题相似的规模较小的问题来求解

递归算法的三要素大体可以总结为:

  • 递归的公式:f(n) = f(n - 1) * n
  • 递归的终结点:f(1)
  • 递归的方向必须走向终结点

经典案例

猴子吃桃:

猴子第一天摘下若干桃子,当即吃了一半,觉得好吃不过瘾,于是又多吃了一个,之后每天如此,等到第十天的时候发现只有一个桃子了。

请问第一天猴子摘下了多少个桃子?

package com.shouyeren.algorithm.recursion;

/**
 * 猴子吃桃问题
 */
public class recursionDemo4 {
    public static void main(String[] args) {
        System.out.println(test(1));//1534
    }


   public static int test(int n){
        if (n == 10){
            return 1;
        }else {
            return 2 * test(n + 1) + 2;
        }
   }
}

非规律化递归案例

文件搜索
package com.shouyeren.algorithm.recursion;

import java.io.File;

/**
 * 文件搜索递归实现
 */
public class recursionDemo5 {
    public static void main(String[] args) {
        searchFile(new File("D:/"),"更新日志.txt");
    }


    /**
     * 搜索某个目录下的全部文件,找到我们想要的文件
     * @param dir 被搜索的源目录
     * @param fileName 被搜索的文件名
     */
   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元一瓶,四个盖子可以换一瓶,两个空瓶可以换一瓶,请问10元钱可以喝多少瓶啤酒,剩余多少个空瓶和盖子?

package com.shouyeren.algorithm.recursion;

/**
 * 需求:
 * 啤酒2元一瓶,四个盖子可以换一瓶,两个空瓶可以换一瓶,
 * 请问10元钱可以喝多少瓶啤酒,剩余多少个空瓶和盖子?
 */
public class recursionDemo6 {
    //定义一个静态成员变量用于储存可以买的酒的数量
    public static int totalNumber;
    public static int lastBottleNumber;//剩余的瓶子数
    public static int lastCoverNumber;//剩余的盖子数

    public static void main(String[] args) {
        //1.拿钱买酒
        buy(10);
        System.out.println("买的酒总数:" + totalNumber);
        System.out.println("剩余的瓶子数:" + lastBottleNumber);
        System.out.println("剩余的盖子数:" + lastCoverNumber);
    }

    public static void buy(int money){
        //2.统计当前能买多少瓶酒
        int buyNumber = money / 2;
        totalNumber += buyNumber;

        //3.把盖子和瓶子换算成钱
        //统计本轮的盖子数和瓶子数
        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);
        }
    }
}

算法对程序员来说及其重要,语言和开发平台不断变化,但是万变不离其宗的是那些算法和理论,刷算法最最最直白的原因就是找一个好的工作,那刷题一定是必不可少的
现在算法刷题平台还是蛮多的,给大家介绍一个我认为与大厂关联最深的平台——牛客网 跳转链接

在这里插入图片描述

感觉不错的话,动手点个赞吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

守夜人st

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

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

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

打赏作者

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

抵扣说明:

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

余额充值