递归以及常用的递归问题

目录

递归的认识

递归的算法

规律化递归

计算1~~n的阶乘

 猴子吃桃问题

 非规律化递归

文件搜索

 啤酒问题


递归的认识

什么是方法递归?

递归做为一种算法在程序设计语言中广泛应用。

方法调用自身的形式称为方法递归( recursion)。

递归的形式

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

间接递归:方法调用其他方法,其他方法又回调方法自己。

方法递归存在的问题?

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

递归的三要素

递归的公式: f(n) =  f(n-1) * n;

递归的终结点:f(1)

递归的方向必须走向终结点:

递归的算法

规律化递归

计算1~~n的阶乘

import java.util.Scanner;

/**
 * ClassName: jiecheng
 * Package: PACKAGE_NAME
 * Description:
 *
 * @Author TYUST-YHB
 * @Create 2023/7/9 16:42
 * @Version 1.0
 */
public class jiecheng {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("input n:");
        System.out.println(diguijiecheng(scanner.nextInt()));
    }
    public static long diguijiecheng(int n){
        if (n==0) return 1;
        else return diguijiecheng(n-1)*n;
    }
}

 猴子吃桃问题

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

这里的是一道填空题,是10天后还有一个桃子,代码写成输入n天还有一个桃子,求第1天摘了多少个

函数:假设猴子前一天桃子数目是y,则y等于今天桃子个数加1再乘二,今天的桃子个数也就是(y-2)/2,所以可以得到递归公式

public class Monkey {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("input n:");
        System.out.println(Dayone(scanner.nextInt()));

    }
    private static int Dayone(int n){
        if (n==1) return 1;
        else return Dayone(n-1)*2+2;
    }
}

 非规律化递归

文件搜索

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

分析: 先定位出的应该是一级文件对象

遍历全部一级文件对象,判断是否是文件

如果是文件,判断是否是自己想要的

如果是文件夹,需要继续递归进去重复上述过程

需求分析:搜索出D:盘下的javaCode文件夹里的file.docx文件,并显示其绝对路径("D:\JavaCode\file.docx")

package digui;

import java.io.File;

/**
 * ClassName: fileDemo
 * Package: digui
 * Description:
 *
 * @Author TYUST-YHB
 * @Create 2023/7/9 17:47
 * @Version 1.0
 */
public class fileDemo {
    public static void main(String[] args) {
        searchFile(new File("D:/"),"file.docx");

    }

    /**
     * 搜索目录下的全部文件,打印文件名称
     * @param dir:文件夹
     * @param filename:文件名称
     */
    private 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 if (file.isDirectory()){
                        searchFile(file,filename);
                    }
                }
            }
        }else System.out.println("error,当前搜索的位置不是文件夹");
    }
}

运行结果 

 啤酒问题

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

答案: 15瓶 3盖子 1瓶子

public class pijiu {
    static int jiu=0;//静态的成员变量存储买到的酒的数量
    static int gaizi=0;//静态变量储存瓶子数
    static int pingzi=0;//静态变量储存盖子数
    public static void main(String[] args) {
        buy(10);
        System.out.println("一共喝了" + jiu + "瓶酒" + "剩余" + gaizi + "个盖子" + "剩余" + pingzi + "个瓶子");
    }
    static void buy(int money){
        //买酒
        int maidejiu=money/2;
        jiu+=maidejiu;
        gaizi+=maidejiu;
        pingzi+=maidejiu;
        //盖子瓶子换钱

        int allmoney=0;
        while (gaizi-4>-1){
            allmoney+=2;
            gaizi-=4;
        }
        while (pingzi-2>-1){
            allmoney+=2;
            pingzi-=2;
        }
        if (allmoney!=0) buy(allmoney);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不爱吃于先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值