Последовательность града, рекурсивная, отсутствует 1 случай - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть следующий код последовательности града, который работает для всех чисел, кроме последовательности 1:

public class Recursion {
    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) {
            System.out.print(str);
        } else {
            if (seed % 2 == 0) {
                System.out.print(str + " ");
                hailstone(seed / 2);
            } else {
                System.out.print(str + " ");
                hailstone((3 * seed) + 1);
            }
        }
    }
}

Как я могу обойти этот особый случай, оставаясь в рекурсивном методе и в void?

Мне не разрешено использовать какие-либо петли.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

1 является точкой выхода вашей рекурсии, поэтому вы не можете заставить ее вести себя как точка входа.Что если вы измените точку выхода?Сделайте 2 точкой предварительного выхода:

public static void hailstone(int seed) {
    String str = "" + seed;

    if (seed == 2) {
        System.out.print(str + " 1");
    } else {
        if (seed % 2 == 0) {
            System.out.print(str + " ");
            hailstone(seed / 2);
        } else {
            System.out.print(str + " ");
            hailstone((3 * seed) + 1);
        }
    }
}

public static void main(String[] args) {
    hailstone(16);
    System.out.println();
    hailstone(15);
    System.out.println();
    hailstone(1);
    System.out.println();
}

напечатает:

16 8 4 2 1
15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
1 4 2 1
0 голосов
/ 07 декабря 2018

В конце небольшая заметка для вашей информации (я удивлен, увидев все статическое в коде).

В точку.Вы говорите, что:

  • вы не можете изменить подпись
  • вы должны использовать рекурсию (циклы не допускаются)

Определить статическое логическое значение и добавить условиедля случая вы достигнете номера 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) впоследствии, и вы поймете, что я имею в виду;это потому, что логическое значение уже было установлено из первого вычисления последовательности.Вам нужно будет сбросить его на ложь снова.Есть лучшие способы спроектировать это ...

...