2013-07-08 4 views
1

Я прошел этот код ниже, а часть, которую я не понимаю, - это то, как значение «Оставляя» значение n равно 2,5 и 10. Я понимаю первую часть рекурсивных вызовов до n == 0 и return берет элемент управления, чтобы перейти к части else и распечатать (0% 2). Разве программа не должна останавливаться после этого?отладка рекурсивных функций

void fun2(int n){ 
    System.out.println("Entering"+n); 
    if(n==0) 
     return; 
    else{ 
     fun2(n/2); 
     System.out.print("Leaving"+n+"---->");  
     System.out.println(n%2); 
    } 
} 

Выход:

 Entering5 
     Entering2 
     Entering1 
     Entering0 
     Leaving1---->1 
     Leaving2---->0 
     Leaving5---->1 
     Leaving10---->0 
+1

Это один из способов отладки. Другим способом является просто шаг за шагом в отладчике. –

+0

Также, как поведение этого кода отличается от того, что вы ожидали? –

+0

Я понятия не имею, как убираются значения «n» ввода. Мне вряд ли пришлось использовать рекурсию, так что трассировка это кажется довольно запутанной задачей. Могли бы вы объяснить? Это не мой код. Я просто добавил отпечатки –

ответ

1

Прежде всего, я считаю, что у Вас есть ошибка в вашем выводе. Когда я запускаю вышеуказанный код, вызывая fun2() со значением 5, я получаю весь вывод, который вы указали , за исключением строки Leaving10---->0. Вы уверены, что это результат вывода функции fun2() или, возможно, артефакт из местоположения кода, где вы вызываете fun2()? Возможно, вы вызываете функцию fun2() со значением 10 и оставите первую первую строку вывода Entering10?

Эта функция работает, вычисляя значение каждой двоичной цифры. Это делается с помощью% оператора, известный как оператор по модулю (также известный как оператор остатка) в последней строке блока еще: System.out.println(n%2);

101 = (1*2^2) + (0*2^1) + (1*2^0) = 4 + 0 + 1 = 5 

Каждая итерация вычисляет следующую более низкую степень числа 2, так как это называется с n/2. Имейте в виду, что вы имеете дело с целым делением здесь, поэтому нет остатка. 1/2 = 0, а не 0,5. Однако функция целочисленного модуля будет работать нормально, поэтому 1% 2 = 1 (1 делится на 2 = 0 с остатком 1).

Вот детальный взгляд на каждом уровне рекурсии метода:

  1. п = 5, п/2 = 2, fun2 (2), п% 2 = 1
  2. п = 2, п/2 = 1, fun2 (1), п% 2 = 0
  3. п = 1, п/2 = 0, fun2 (0), п% 2 = 1
  4. п = 0, метод возвращает

Когда вы помещаете отдельный вывод консоли вместе, вы получаете 101, который является двоичным f или 5.

Если бы вы назвали fun2() со значением параметра 10, то вы бы увидели выход 1010:

1010 = (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = 8 + 0 + 2 + 0 = 10 
Смежные вопросы