日期:2014-05-20  浏览次数:20817 次

递归调用的一个问题。。。求大神指教。。。
假设有50瓶饮料,喝完3个空瓶可以换一瓶饮料,依此类推,请问总共喝了多少瓶饮料



  各种报错,直接怒了全部加static也报错。。。求实现。。。


 
Java code

       public class Demo2 {
    static int k=0;//第二轮开始的瓶数
    static int a=50;//一开始共计买了多少瓶水
    static int b=0;//b=a/3,第一轮下来兑换了多少瓶
    static int c=0;//第一轮下来剩下多少瓶
    static int sum=50;
    public static void drink(int a)
    {
        if(a>=0)
        {
            b=a/3;//50/3=16瓶
            c=a-b*3;//c=50-16*3=2瓶
            k=b+c;//k=16+2=18瓶
            a=k;//a=k=18瓶作为下一次循环的a
            drink(a);//递归调用玩不来。。。求指教。。。这地方会报java.lang.StackOverflowError
            sum+=b;//把b中除出来的数都累加到sum中
        }        
    }
    public static void main(String[] args) {
        int a=50;
        Demo2 demo2=new Demo2();
        demo2.drink(a);
        System.out.println("总共喝了"+sum+"瓶");
        
    }

}



------解决方案--------------------
你的a>=0肯定是恒成立的,递归当然是不会结束的拉。你把a>=0改成a>0看行不行。
其实你不用那么麻烦。假设你买了a瓶水,只要从里面拿出2个瓶盖,就可以换的1瓶,因为换得那瓶还是有盖子的
------解决方案--------------------
你的递归写错了,导致递归无法结束,就挂了。

错误的原因,是因为你的终止条件错了,变成无法终止了;给你个简单的参考吧:

Java code
public class DrunkBottle {

    public static void main(String[] args) {
        System.out.println("Begin 50, End with: " + drink(50));
    }

    private static int drink(int bottles) {
        if (bottles >= 3) { // 3瓶以下没有奖励,不需要递归计算了,这是重要终止条件
            int rewards = bottles / 3; // 奖励
            int sum = drink(rewards + bottles % 3); // 递归喝:用“剩余+奖励”递归的喝
            return rewards * 3 + sum; // 总计:本次喝 + 递归喝
        } else {
            return bottles; // 最后几瓶而已了
        }
    }
}

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

 public class Demo2 {
    static int k=0;//第二轮开始的瓶数
    static int a=50;//一开始共计买了多少瓶水
    static int c=0;//第一轮下来剩下多少瓶
    static int sum=50;
    public static void drink(int a)
    {
        if(a>=3)
        {
            int  b=a/3;//50/3=16瓶
            c=a-b*3;//c=50-16*3=2瓶
            k=b+c;//k=16+2=18瓶
            a=k;//a=k=18瓶作为下一次循环的a
            drink(a);//递归调用玩不来。。。求指教。。。这地方会报java.lang.StackOverflowError
            sum+=b;//把b中除出来的数都累加到sum中
        }        
    }
    public static void main(String[] args) {
        int a=50;
        Demo2 demo2=new Demo2();
        demo2.drink(a);
        System.out.println("总共喝了"+sum+"瓶");
        
    }

}

------解决方案--------------------
探讨

你的递归写错了,导致递归无法结束,就挂了。

错误的原因,是因为你的终止条件错了,变成无法终止了;给你个简单的参考吧:

Java code
public class DrunkBottle {

public static void main(String[] args) {
System.out.println("Begin 50, End with: " ……

------解决方案--------------------
我是这样写的,结果是74

Java code

public class TestPing {
    public static void main(String[] args){
        int n = 50;
        int x = 0;
        while(n >= 3){
            n = n-3+1;
            x = x+3;
        }
        x = x+n;
        System.out.println("一共可以喝"+x+"瓶。");
    }
}

------解决方案--------------------

public class DrinkTest {

/**
* 遞減法
* @param botles
* @return
*/
private int drinkBotles(int botles){
// 喝的饮料总数
int totleDrinked =0;
// 满瓶子数
int fullBotles=botles;
// 還能換瓶子的時候
while(fullBotles>=3){

//總瓶子數=fullBotles-3+1
fullBotles=fullBotles-2;