2015-03-30 3 views
0

Я пытаюсь напечатать лирику до 99 бутылок пива, но я получаю бесконечную рекурсию, установленную в первом стихе. Любые идеи о том, как я могу избавиться от этой бесконечной рекурсии?Бесконечная рекурсия для 99 бутылок пива

public static void bottlesOfBeer(int beer) { //prints the lyrics for "99 bottles of Beer on the wall". 
     if (beer == 99) { 
      for (beer = 99; beer > 0; bottlesOfBeer(beer - 1)) { 
       System.out.println(beer 
        + " bottles of Beer on the wall!" 
        + beer + " bottles of Beer!" 
        + " Take one down, pass it around, " 
        + minusOneBeer(beer) + " bottles of beer on the wall!"); 
      } 
     } 
    } 

    public static int minusOneBeer(int beer) { 
     return beer - 1; 
    } 
} 
+0

Вы пытались использовать итерацию или рекурсию? Похоже, вы в основном были смущены и пытались использовать оба. – Radiodef

+0

Я пытался рекурсии – pati3ntzero

+0

Просто, чтобы дать вам подсказку: ваш метод будет следовать форме, как 'static void bottles (int b) {if (b> 0) бутылки (b - 1); } ', который будет отсчитываться до 0. – Radiodef

ответ

0

взгляд на ваш метод bottlesOfBeer(int beer) -

public static void bottlesOfBeer(int beer) 

это тип возвращаемого значения является недействительным. Вы используете его в своем цикле for в качестве заполнителя приращения/уменьшения

Возвратите некоторый int из public static void bottlesOfBeer(int beer) этот метод.

Надеюсь, это поможет.
Спасибо.

0

ОК, проблема в том, что вы никогда не уменьшаете пиво. Правильный способ сделать это - заменить часть bottlesOfBeer(beer-1) на beer--. Это автоматически уменьшает пиво каждый раз, когда цикл проходит курс.

Это также означает, что проверка if (beer == 99) может быть удалена. Если вы всегда хотите, чтобы он начинался с 99, сделайте константу с именем BEERS_START = 99 и используйте ее для инициализации пива. Если вы хотите, чтобы он мог начать с произвольного целого числа, просто удалите чек.

EDIT: Учитывая, что вашему учителю требуется рекурсия, вам следует обращаться с рекурсией по-другому. Я не буду предоставлять код, так как я не могу представить хороший пример, не вдаваясь в суть вашего задания для вас. Однако есть гораздо более простой способ сделать это, чем то, что вы делаете. В этом методе вам не нужен цикл for. В этом случае вам также не нужно утверждение if. Попробуйте создать рекурсию без цикла for и без оператора if. Конечный результат будет намного проще после того, как вы туда доберетесь.

Если у вас по-прежнему возникают проблемы после нескольких попыток, опубликуйте обновленный код в вопросе, содержащий ваши новые попытки, и дайте мне знать в другом комментарии. Я посмотрю, смогу ли я помочь оттуда.

+0

Так я получил его изначально, когда я отправил его учителю (да, я студент, обучающийся на Java), учитель сказал, что« bottlesOfBeer » метод, необходимый для вызова себя. – pati3ntzero

+0

@ pati3ntzero ОК, учитывая произвольное требование вашего учителя, я дал несколько рекомендаций в ответе. Я не могу дать вам код, так как я бы по сути дал вам ответ, но, надеюсь, он указывает вам в правильном направлении. –

1

Я не думаю, что это делает то, что вы думаете, что оно делает. Существует рекурсия , но он проходит только один слой. Когда вы вызываете bottlesOfBeer(beer - 1), этот рекурсивный вызов гарантированно ничего не сделает из-за if (beer == 99) в начале метода.

В этом случае вы укажете только if, если beer == 99, поэтому при повторном вызове метода с beer - 1 он не выполнит инструкцию if и конец рекурсии.

То, что вы видите, это бесконечный цикл (отличаются от бесконечной рекурсии), потому что ни где в вашем for контуре не является локальной копии beer убавлением. Таким образом, beer в цикле for всегда будет 99, и поэтому цикл for будет работать вечно.

Вы, вероятно, хотите что-то вроде этого:

public static void bottlesOfBeer(int beer) { 
    if (beer > 1) { 
     System.out.println(beer 
       + " bottles of Beer on the wall!" 
       + beer + " bottles of Beer!" 
       + " Take one down, pass it around, " 
       + (beer - 1) + " bottles of beer on the wall!"); 
     bottlesOfBeer(beer - 1); 
    } 
    else if (beer == 1) { 
     System.out.println(beer 
       + " bottle of Beer on the wall!" 
       + beer + " bottle of Beer!" 
       + " Take one down, pass it around, " 
       + " no more bottles of beer on the wall!"); 
    } 
    else { 
     // Do nothing if beer <= 0 
    } 
} 
+0

Что случилось с 'else if (beer == 0) {System.out.println (« зайдите в магазин и купите еще »); } '? – Aemyl

+0

Не знаете, на что вы ссылаетесь. – curob

2

Yours на самом деле не рекурсивный подход к проблеме. Обычно рекурсия выполняется вместо. У вас есть нечетный mashup рекурсии и итерации.

Если ваше требование - решить проблему через рекурсию, то выясните, как это сделать без какой-либо конструкции цикла (нет, я не буду делать домашнее задание для вас). На самом деле у вас на самом деле есть большая часть того, что вам нужно.

0

попробовать это

public class HelloWorld { 
public static void main(String[] args) { 
    beers(3); 

} 

public static void beers(int n) { 
    if (n == 0){ 
     System.out.println(); 
     System.out.println("No bottles of beer on the wall"); 
     System.out.println("no bottles of beer,"); 
     System.out.println("ya’ can’t take one down, ya’ can’t pass it around,"); 
     System.out.println("’cause there are no more bottles of beer on the wall!"); 
    } 
    else{ 
     System.out.println(n + " bottles of beer on the wall"); 
     System.out.println(n + " bottles of beer"); 
     System.out.println("Ya drink one down, pass it around,"); 
     System.out.println((n-1) + " bottles of beer on the wall"); 
     System.out.println(); 

     beers(n - 1); 

    } 
} 
} 
Смежные вопросы