经典算法题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;
    }

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

你可能感兴趣的:(算法,递归)