一个很有意思的选择题,一次性给你一百万和第一天给你一元,然后在一个月(30天)内每天给你前一天的两倍的钱,你会选择哪一种!
我刚开始也觉得选第一种,一百万哪,第二种才一块钱,虽然分了30天每天给前一天的一倍,我觉得30天也没多少。
后来经过验证,惊讶的发现选择第一种的完全是笨蛋,因为第二种在30天以后居然可以得到十亿元之多。下面是我写的程序,用的循环,但最近在学递归,我很想用递归算法把这个程序写出来。不过小弟初入门道,才疏学浅,还望路过的大哥指点指点,感激不尽!
public static void main(String []args){
long total=count(30);
System.out.println("最终应付:"+total);
}

public static long count(long day){
long totalPrice=0;
long Price=1;
for(int i=1;i<=day;i++){
if(i==1){
Price=1;
}else{
Price = Price*2;
}
totalPrice +=Price;
System.out.println("当天的钱:"+Price+",当天是第"+i+"天");
System.out.println("当天之前一共:"+totalPrice);
}

return totalPrice;
}希望哪位路过的大哥能给出一个递归算法!让小弟学习学习!感激不尽!

解决方案 »

  1.   

    public long count(long day){
       if(day==1)
       {
          return 1;
        }else
        {
           return 2*count(day-1)
        }
    }
      

  2.   

    本帖最后由 AWUSOFT 于 2011-08-16 01:35:39 编辑
      

  3.   

    public class A{
    public static void main(String []args){  long a=1000000;
      int i=1;
    long mony=1;for(i=2;i<=30;i++){
      mony=mony*2;
    }
    System.out.println("第二种方法求的总钱:"+mony);}
    }
    结果:536870912,很显然第二种方法合算。
      

  4.   

    一楼只算出了最后一天应该付的钱,但没有算出从第一天到最后一天一共的钱,小弟刚刚学习java,很多地方都不懂,希望哪位大哥指点一下呀!
      

  5.   


    public class Help { public static void main(String[] args) {
    int total=0;
    for(int i=1;i<=30;i++){
    total+=b(i);
    }

    System.out.println(total);
    }
    static int b(int c){
    if(c==1)return 1;
    return b(c-1)*2;
    }
    }
    是这样吧?
      

  6.   

    public static long count(int day) {
        if (day == 1)
            return 1;
        return 2 * count(day-1);
    }

    public static void display(){
        long sum = 0;
        for (int i = 30; i > 0; i--) 
            sum += count(i);
        System.out.println("最终应付:" + sum);
    }public static void main(String[] args) {
        display();
    }
      

  7.   

    每天是前一天的2倍,第一天是1块,所以最后就是 2的29次方
    不用递归也能算int sum = 1; //第一天
    for (int i=1; i<=30; i++) {
        sum *= 2; //即 sum = sum * 2; //每天是前一天的2倍
    }
    System.out.println(sum);
      

  8.   

    等比数列求和公式
    return 1 * (1 - days * Math.pow(2, 30)) / (1 - 2);
      

  9.   

    额,修正下return 1 * (1 - Math.pow(2, 30)) / (1 - 2);