简单解析递归算法

递归算法

核心三要素:

  1. 终结点
  2. 公式
  3. 算法的走向(走向终结点)
经典案例(猴子吃桃)
/**
    目标:递归的经典案例。

    猴子吃桃:
        猴子第一天摘了若干个桃子,当即吃了一半,觉得好不过瘾,然后又多吃了一个。
        第二天又吃了前一天剩下的一半,觉得好不过瘾,然后又多吃了一个。
        以后每天都是如此
        等到第十天再吃的时候发现只有1个桃子,请问猴子第一天总共摘了多少个桃子。

    公式:
        f(x+1) = f(x) - f(x) / 2 - 1
        2f(x+1) = 2f(x) - f(x) - 2
        2f(x+1) = f(x) - 2
        f(x) = 2f(x+1)+2
    递归的三要素:
        (1)公式:f(x) = 2f(x+1)+2
        (2)终结点:f(10) = 1
        (3)递归的方向:走向了终结点

 */
public class RecursionDemo04 {
    public static void main(String[] args) {
        System.out.println(f(1));
    }
    public static int f(int x){
        if( x == 10){
            return 1 ;
        }else{
            return 2*f(x+1)+2;
        }
    }
}
递归实现文件搜索

非规律性递归按照业务流程进行编程

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

public class Dome {
    public static void main(String[] args) {
        searchFile(new File("E/Green"),"Everything");
    }
    public static void searchFile(File dir ,String fileName){
        //判断是否存在该路径,是否是文件夹
        if (dir.exists()&&dir.isDirectory()) {
            File[] files = dir.listFiles();
            //判断是否存在一级文件对象
            if (files!=null&&files.length>0) {
                for (File f : files) {
                    if (f.isFile()) {
                        if (f.getName().contains(fileName)) {
                            System.out.println(f.getAbsolutePath());
                            try {
                                //启动它
                                Runtime r = Runtime.getRuntime();
                                r.exec(f.getAbsolutePath());
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }else{
                        searchFile(f,fileName);
                    }
                }

            }
        }
    }
}
非规律性递归算法
/*题目:一个人拥有十元钱,啤酒2元每瓶,两个空瓶子可以兑换一瓶,四个盖子可以兑换一瓶,
 * 问:这个人可以和几瓶酒,剩几个瓶子和几个盖子?*/
public class Dome01 {
    public static void main(String[] args) {
        int money =10;
        //十块钱买了五瓶
        int beer =money/2;
        //剩下的瓶子数是
        int lastPingZi = beer;
        //剩下的盖子数是
        int lastGaiZi = beer;
        //总得喝酒数
        int num = beer;


        while (true){
            if(lastGaiZi>=4){
                lastGaiZi-=4;
                num+=1;
                lastGaiZi+=1;
                lastPingZi+=1;
            }else if(lastPingZi>=2){
                lastPingZi-=2;
                num+=1;
                lastGaiZi+=1;
                lastPingZi+=1;
            }else if(lastGaiZi<4&&lastPingZi<2){
                break;
            }
        }

        System.out.println("剩余瓶子"+lastPingZi);
        System.out.println("剩余盖子"+lastGaiZi);
        System.out.println("总共喝酒数是"+num);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值