递归java求解猴子吃桃问题

递归与分治

递归是一个分治思想的具体实现,分治(divide and conquer)的全称称为“分而治之”,分治即是将大问题划分为若干个规模较小、可以直接解决的子问题,然后解决这些子问题,最后将这些子问题的解合并起来,即是原问题的解。

分治是一种思想,它不涉及到具体的算法,而大多数情况下,分治都是借由递归来实现的。。从c语言和java语言的角度来讲,递归就是这个函数或者方法反复调用自身,然后将问题一步步地缩小,直到这个问题已经缩小到可以直接解决的程度,然后再一步一步地返回,最终解决原问题。

猴子吃桃

有一只猴子捡了一堆桃子,它第一天吃了一半,觉得好吃,就又吃了一个;第二天吃了剩下的一半,觉得好好吃,就又又吃了一个;第三天同样吃了剩下的一半,还是觉得好好好吃,就又又又吃了一个;到第四天的时候就只剩下一个桃子了。问猴子捡了多少桃子?

算法思想

假设第一天时候有x个桃子,第二天为y,第三天为z,第四天的时候剩下一个;从最后一天开始逆推,最后一天的前一天共有z个,然后z/2+1个,因此最后一天用z表示就是z-(z/2+1),所以由z-(z/2+1)=1得出,z=2*(1+1);依此类推,第二天y=2*(z+1);第一天为x=2*(y+1);如图所示。
在这里插入图片描述

递归的基本要素

1.递归终止的条件
2.递归的操作

if// 递归终止条件){
 
}
// 递归操作

代码实现

public class RecursionTest {
    //猴子吃桃
    public int eachPeach(int day){
        // 递归终止的条件
        if(day==1){
            return  1;
        }
        //递归操作

        return 2*(eachPeach(day-1)+1);
    }

    public static void main(String[] args) {
        RecursionTest recursionTest = new RecursionTest();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入天数");
        int day = scanner.nextInt();
        int count =  recursionTest.eachPeach(day);
        System.out.println(count);
    }
}

运算结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值