20220530_Java_方法递归

初始类
方法内调用方法自身

public class RecursionDemo1 {
    public static void main(String[] args) {
        System.out.println("sum:1***5");
        System.out.println(recur(5));

        System.out.println("sum:1+++5");
        System.out.println(recur1(5));
    }

    private static int recur1(int i) {
        if (i == 1) {
            return 1;
        } else {
            return recur1(i - 1) + i;
        }
    }

    private static int recur(int i) {
        if (i == 1) {
            return 1;
        } else {
            return recur(i - 1) * i;
        }
    }
}

猴子吃桃案例

public class RecursionDemo2 {
    public static void main(String[] args) {
        /**
         * 猴子吃桃问题,每天吃现存的一半,加一颗,第十天只剩一颗,求第一天共多少
         * f(2) = f(1)/2 -1; 第一天吃一半,再多吃一个,就是第二天的存量
         * f(n) = f(n-1)/2 - 1; 2f(n) = f(n-1) -2; 这个方向向第二天,不向第一天,所以把括号里的变量加一
         * 2f(n+1) = f(n) -2; f(n) = 2f(n+1) +2; 这样,方向就能从第一天递到第十天,从第十天归回
         */
        System.out.println("There are total "+recur(1)+" peach at first day.");
        System.out.println(recur(2));
        System.out.println(recur(3));
        System.out.println(recur(4));
        System.out.println(recur(5));
        System.out.println(recur(6));
        System.out.println(recur(7));
        System.out.println(recur(8));
        System.out.println(recur(9));

    }

    private static int recur(int i) {
        if (i == 10) {
            return 1;
        } else {
            return recur(i + 1)*2 + 2 ;
        }
    }
}

查找指定对象,此处一wmplayer为例,有bug没解决,看思想

import java.io.File;
import java.io.IOException;

public class RecursionDemo3 {
    /**
     * search an exe file
     * C:\Program Files\Windows Media Player\wmplayer.exe
     */
    public static void main(String[] args) {
        searchFile(new File("C:/"),"wmplayer.exe");
    }

    private static void searchFile(File dir ,String originName) {
        if (dir != null && dir.isDirectory()){
            /**此处是看C盘本身是否存在,且是不是一个文件夹*/
            File[] files = dir.listFiles();
            /**跟着判断当前目录下有一极文件对象,且可以拿到files中
             * 因为有的时候设置了权限的拿不到,有一级对象也会length小于0*/
            if (files != null && files.length >0){
                for (File file : files) {
                    if (file.isFile()){
                        if (file.getName().contains(originName)){
                            System.out.println("Find out Bingo! It's at: "+file.getAbsolutePath());
                            if (file.getName().equals(originName)){
                                Runtime r = Runtime.getRuntime();
                                try {
                                    r.exec(file.getAbsolutePath());
                                    /**实践证明,wmplayer打开了,但会报IO异常,因为下面无论是break或return都无法终止递归查找
                                     * 之后找到的wmplayer文件无法runtime*/
                                    break;
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        }

                    }else {
                        searchFile(file,originName);
                    }
                }
            }
        }else {
            System.out.println("Sorry, this path is not a folder.");
        }
    }
}

买啤酒案例

public class RecursionDemo4 {
    /**
     * 买酒案例 先定义静态变量几个
     * 两元一瓶
     * 两个瓶子凑齐可以兑换一罐,有两个瓶子,等于钱加两元,未满不算
     * 四个盖子可以兑换一瓶,有四个盖子等于钱加两元,未满不算
     */
    public static int totalBuyNum;
    public static int lastBottleNum;
    public static int lastCoverNum;

    public static void main(String[] args) {
        buyBeer(10);
        System.out.println(totalBuyNum);
        System.out.println(lastBottleNum);
        System.out.println(lastCoverNum);
    }

    private static void buyBeer(int money) {
        int buyNum = money/2;
        totalBuyNum += buyNum;

        int bottleNum = lastBottleNum + buyNum;
        int coverNUm = lastCoverNum + buyNum;

        int moneyInHand = 0;
        if (bottleNum >= 2){
            moneyInHand += (bottleNum / 2) * 2;
        }
        lastBottleNum = bottleNum % 2;
        if (coverNUm >= 4){
            moneyInHand += (coverNUm / 4) * 2;
        }
        lastCoverNum = coverNUm % 4;

        if (moneyInHand >= 2){
            buyBeer(moneyInHand);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值