2015-05-18 4 views
4

У меня есть программа, и я не понимаю ее результата. Это дает мне 110, но я не знаю, как это возможно. Я называю это только один раз. Для меня это должно быть 3 ?? СпасибоПрограмма трудно понять

public class Test { 
    public static String operator (int n) { 
     return((n == 0) ? "" : operator(n/2) + (n % 2)); 
    } 

    public static void main(String[] args) { 
     System.out.println(operator(6)); 
    } 
} 
+2

Я не думаю, что проблема рекурсия, это конкатенация строк, запутанная с арифметикой. – Paul

+0

Для этого вам нужен отладчик. Поместите программу в отладчик и пройдите через нее шаг за шагом. Я мог бы рекомендовать отделить все утверждения в составной инструкции, чтобы вы могли видеть результат каждого из них; создайте temp vars для хранения результатов каждого вызова operator() и т. д. Ваша первоначальная проблема, по предположению, заключается в том, что вы не понимаете, что она рекурсивна - метод operator() вызывает себя. – arcy

+0

Я не вижу конкатенации строк в программе ... – arcy

ответ

6

Рекурсии в этой функции приводит к середине неоднократного оцененной с модулем исходного аргумента, приложенным с каждой итерацией. Таким образом, следует расширение оператора (6)

  1. оператор (6) => оператор (6/2) + (6% 2) = оператор (3) + "0"
  2. оператор (3) = > оператор (3/2) + (3% 2) = оператор (1) + "1"
  3. оператор (1) => оператор (1/2) + (1% 2) = оператор (0) + " 1"
  4. оператор (0) => ""

рекурсия заканчивается на 4-й итерации, а результат разматывают становится "110"

0

operator возвращает строку. Таким образом, результат operator(n/2)+(n%2) добавляет (конкатенирует) строку из operator(n/2) со значением (n%2), который автоматически преобразуется в строку так, что он может быть объединен.

Попробуйте изменить operator вернуть int и изменив строку следующим образом:

return((n == 0) ? 0 : operator(n/2)+(n%2)); 
3

Это простой рекурсивный метод, который может быть выражен как это, чтобы сделать его более удобным для чтения:

operator(0) = "" 
operator(n) = operator(n/2) + (n % 2) 

Так следуя этим правилам, operator(6) = "110" следующим образом:

operator(6) = operator(6/2) + (6 % 2) 
      = operator(3) + 0 
      = operator(3/2) + (3 % 2) + 0 
      = operator(1) + 1 + 0 
      = operator(1/2) + (1 % 2) + 1 + 0 
      = operator(0) + 1 + 1 + 0 
      = "" + 1 + 1 + 0 
      = "110" 
Смежные вопросы