Двузначное рекурсивное преобразование целого числа в строку - PullRequest
0 голосов
/ 13 октября 2019

Я понятия не имею, как присвоить строковому значению число и сделать его автоматически распознаваемым, чтобы сделать число строковым значением. Проблема заключается в следующем:

Чтобы написать метод рекурсивно: 1) рассмотрим базовый случай возврата только самого числа, когда оно меньше 12 (частное будет 0 при делении на 12, а остаток равенномер). верните «A» или «B», если число равно 10 или 11.

2) рассмотрите рекурсивный случай числа, большего или равного 12. В этом случае сначала вызовите метод рекурсивно, используя частноеи объединить результат (используйте оператор + для соединения строк) с результатом другого рекурсивного вызова с использованием остатка. Возврат объединенного результата двух рекурсивных вызовов.

Пример;20А будет:

2 х 12 ^ 2 + 0 х 12 ^ 1 + 10 х 12 ^ 0 = 2 х 144 + 0 х 12 + 10 х 1 = 288 + 0 + 10 = 298

Я знаю, что код прямо сейчас неверен

public class Duodecimal {
  public static String toBase12(int n) {
    //TODO: complete this method
    if (n==10)
    return "A";
    if (n==11)
    return "B";
    if (n<12)
    return n;
    else {
      if (n%12==10)
      return (n/12 + "A");
      if (n%12==11)
      return (n/12 + "B");
      else
      return n/12;
    }
  }
}

Ответы [ 3 ]

1 голос
/ 13 октября 2019

На листе бумаги вы бы пошли следующим образом:

  1. Разделите ввод на двенадцать и сохраните остаток.
  2. Разделите результат еще раз на двенадцать и сохраните остаток.
  3. продолжайте со второго шага, пока результат не станет равным нулю. Объедините остатки от каждого шага снизу вверх.

С вашим примером ввода:

298 / 12 = 24 rem 10 (A)
 24 / 12 = 2  rem 0
  2 / 12 = 0  rem 2

Therfore

298 in base 10 = 20A in base 12
1 голос
/ 13 октября 2019

Вы # 1 сделали почти правильно (return n не скомпилируется), поэтому давайте посмотрим на # 2:

рассмотрим рекурсивный случай числа, большего или равного 12. ВВ этом случае сначала вызовите метод рекурсивно, используя частное, и конкатенируйте результат (используйте оператор + для соединения строк) с результатом другого рекурсивного вызова, используя остаток. Возврат объединенного результата двух рекурсивных вызовов.

Давайте сделаем это по одному шагу за раз, работая над жирным шрифтом.

сначала вызовите метод рекурсивно используя частное

int quotient = n / 12;

first вызвать метод рекурсивно используя частное

toBase12(quotient)

результат другого рекурсивного вызова с использованием остатка

int remainder = n % 12

результат другого рекурсивного вызова с использованием остатка

toBase12(remainder)

[...] и объединяют результат (используйте оператор + для соединения строк) с [...]

toBase12(quotient) + toBase12(remainder)

Возвращает объединенный результат двух рекурсивных вызовов

Давайте также удалим переменные:

return toBase12(n / 12) + toBase12(n % 12)

Как видите,задание включало в себя пошаговые инструкции о том, что вы должны делать. Все, что вам нужно было сделать, это написать код, который вам объяснил.

Окончательный результат:

public static String toBase12(int n) {
    if (n < 10)
        return Integer.toString(n); // or  String.valueOf(n)  or  "" + n
    if (n == 10)
        return "A";
    if (n == 11)
        return "B";
    return toBase12(n / 12) + toBase12(n % 12);
}

Тест

System.out.println(toBase12(298));

Выход

20A
0 голосов
/ 13 октября 2019

Вот способ сделать это с помощью хвостовой рекурсии. Второй метод накапливается до тех пор, пока вы не опуститесь до нуля, а затем вернетесь.

public class Base12 {
    public static String toBase12(int n) {
        return toBase12(n, "");
    }

    private static String toBase12(int n, String value) {
        return n <= 0 ? value : toBase12(n/12, toBase12Char(n%12) + value);
    }

    private static char toBase12Char(int n) {
        return n == 11 ? 'B' : (n == 10 ? 'A' : Integer.toString(n).charAt(0));
    }
}

public class Base12Test {
    @Test
    public void Test20A() {
        int n = 298;

        String expectedValue = "20A";
        String actualValue = Base12.toBase12(n);

        Assert.assertEquals(expectedValue, actualValue);
    }
}
...