日期:2014-05-19  浏览次数:20702 次

又是递归题给难倒!
一个农场有N斤草,一只羊第一天吃了一半的草,第二天又吃了这些草得一半多一斤
  ,第三天又吃了这些草得一半多两斤,到N天的时候,农场的草只剩下一斤。
1.请问这只羊吃了多少天,才把这N斤的草吃剩一斤?
2.计算这N斤的草有多少斤?

------解决方案--------------------
for (int day = N; day > 0; --day) {
sum = sum * 2 + 1;
}
------解决方案--------------------
Java code

int sum=1;    //总量
int number=n-1;    //多余吃掉的

void fun (int sum , int number ,int n)
{
  if(number==0)
  {
     System.out.println("");
     break;
   }
   else
   {
      sum=sum*2 + number;
      number=number-1;
      n--;
      fun(sum,number,n);
    }
}

------解决方案--------------------
Java code

int fun (int n)
{
  if(n==0)
  {
     return 1;
   }
   else
   {
      return (fun(n-1)+n-1)*2;
    }
}

------解决方案--------------------
反向看的话 最后一天省的草得数量为 2 * (N + 1) N从0开始计算 所以 只要>=3理论都是可以有值的 
Java code

public class Test1 {
     
    public static int getSUM(int day,int sumday){
        if(day == sumday ){
            return 2 * (day + 1);
        }else{
            return (getSUM(day + 1,sumday) + day  ) * 2;
        }
    }
    /**
     *@param args
     */
    public static void main(String[] args) {
        int maxdays = 20;//考虑到最大的整数为2^31 - 1 所以将值设小一点
        for(int i = 3;i < maxdays;i++){
            System.out.println((i + 1)+"天吃完:草得总斤数:"+getSUM(0,i));
        }
      
    }

}

------解决方案--------------------
Sn = 1/2Sn-1 - (n-1) n > 1
则 Sn-1 = 2*(Sn + n -1)

code:
int N = 1;
int day = 10;
for(int i = day; i>0; i--){
System.out.printf("第%d天剩下草的重量是:\t%d\n",i,N);
// i = 1时,求出的前一天的草的重量N,就是总重量
N = 2*(N + i -1);
}
System.out.printf("总共有草:\t%d斤\n" , N);
------解决方案--------------------
1和2是两个问题,都可以用递归求解,范例+Demo如下:

Java code

public class EatGrass {

    // 问题1:给定草的斤数n,求解天数
    public static int getDays(int n, int... x) throws Exception {
        if (n==1) return 0;
        if (n<1 || n%2==1) throw new Exception("草的斤数不合法,无解");
        int p = x.length==0?0:x[0];
        return getDays(n/2-p, p+1)+1; 
    }
    
    // 问题2:给定天数d,求解草的斤数
    public static int getGrass(int d, int... x) {
        if (d<0) return -1; //不正确的输入天数
        if (d==0) return 1;
        else {
            int p=x.length==0?0:x[0];
            return (getGrass(d-1, p+1) + p)*2;
        }
    }
    
    public static void main(String[] args) {
        for (int i=0; i<=10; i++) 
            System.out.println("给定天数" + i + ", 草斤数=" + getGrass(i));
        System.out.println();

        for (int i=0; i<40; i++) {
            try {
                System.out.println("给定草斤数" + i + ",天数= " + getDays(i));
            } catch (Exception e) {
                System.out.println("给定草斤数" + i + ",没有合适的天数");
            }
        }
    }

}

------解决方案--------------------
四楼是对的 别的没看 我也是这个答案
------解决方案--------------------
回帖加分
------解决方案--------------------
Java code

private final static int datecount = 12;
public static void main(String args[]) throws ParseException  {
    eatTheGrass(1);
}
    
private static int eatTheGrass(int date){
    
    if(date == datecount){
        System.out.println("第"+date+"天有草"+1+"斤");
        return 1;
    }else{
        int n = (eatTheGrass(date+1)+ date-1)*2;
        System.out.println("第"+date+"天有草"+n+"斤");
        return n;
    }
}