Прежде всего, я считаю, что у Вас есть ошибка в вашем выводе. Когда я запускаю вышеуказанный код, вызывая 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).
Вот детальный взгляд на каждом уровне рекурсии метода:
- п = 5, п/2 = 2, fun2 (2), п% 2 = 1
- п = 2, п/2 = 1, fun2 (1), п% 2 = 0
- п = 1, п/2 = 0, fun2 (0), п% 2 = 1
- п = 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
Это один из способов отладки. Другим способом является просто шаг за шагом в отладчике. –
Также, как поведение этого кода отличается от того, что вы ожидали? –
Я понятия не имею, как убираются значения «n» ввода. Мне вряд ли пришлось использовать рекурсию, так что трассировка это кажется довольно запутанной задачей. Могли бы вы объяснить? Это не мой код. Я просто добавил отпечатки –