В конце небольшая заметка для вашей информации (я удивлен, увидев все статическое в коде).
В точку.Вы говорите, что:
- вы не можете изменить подпись
- вы должны использовать рекурсию (циклы не допускаются)
Определить статическое логическое значение и добавить условиедля случая вы достигнете номера 1.Последняя последовательность в последовательности града - это бесконечный паттерн.Особый случай заключается в том, что вам нужно, чтобы программа остановилась в какой-то момент.Здесь я просто использую логическое значение для печати шаблона один раз после того, как число 1 было достигнуто впервые.Я надеюсь, что код самообъясним.
public class Recursion {
private static boolean reached = false;
public static void main(String[] args) {
//hailstone(16); // prints 16 8 4 2 1
hailstone(1); //prints just 1 instead of 1 4 2 1
}
public static void hailstone(int seed) {
String str = "" + seed;
if (seed == 1 && reached) {
System.out.print(str);
} else if (seed == 1 && !reached) {
System.out.print(str + " ");
reached = true;
hailstone((3 * seed) + 1);
} else {
if (seed % 2 == 0) {
System.out.print(str + " ");
hailstone(seed / 2);
} else {
System.out.print(str + " ");
hailstone((3 * seed) + 1);
}
}
}
}
Примечание. В Java обычно не рекомендуется кодировать множество статических членов / методов.Я думаю, это может быть лучше.Я не хотел вдаваться в подробности, потому что не хочу путать и хотел бы сосредоточиться на этом вопросе.Есть недостаток, чтобы кодировать это так, как я сделал, например.Просто попробуйте позвонить hailstone(16)
и hailstone(1)
впоследствии, и вы поймете, что я имею в виду;это потому, что логическое значение уже было установлено из первого вычисления последовательности.Вам нужно будет сбросить его на ложь снова.Есть лучшие способы спроектировать это ...