经典算法题03-猴子吃桃

问题描述:

猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个。第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个。以后每天都吃前一天剩下的一半再加一个。到第10天刚好剩一个。问猴子第一天摘了多少个桃子?

分析:
这是一套非常经典的算法题,这个题目体现了算法思想中的递推思想,递归有两种形式,顺推和逆推,针对递推,只要

    我们找到递推公式,问题就迎刃而解了。

           令S10=1,容易看出 S9=2(S10+1), 简化一下 

             S9=2S10+2

             S8=2S9+2

                 .....

             Sn=2Sn+1+2

遥想公瑾当年,老师说递归是最简洁,最容易理解的,好,就用递归试一下:

    public static void main(String[] args) throws IOException {

        int sum = a(1);
        int s = b(1, 1);
        System.out.println("sum:" + sum);
        System.out.println("s:" + s);

    }

    private static int b(int i, int j) {

        if (i == 10) {
            return j;
        }
        return b(i + 1, 2 * j + 2);
    }


    public static int a(int day) {
        if (day == 10) {
            return 1;
        }
        return 2 * a(day + 1) + 2;
    }

这里写图片描述

这样就用顺序递归和尾递归完成了计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值