Рекурсия. Разница в передаче аргументов методу
Делаю через рекурсию перевод чисел в двоичную систему. Не могу понять, в чем разница между
static void bin(int num){
if (num >= 2){
num = num / 2;//неправильно работает
bin(num);
}
System.out.print(num%2);
}
и
static void bin(int num){
if (num >= 2){
bin(num / 2);//корректно работает
}
System.out.print(num%2);
}
Ответы (2 шт):
Побуду вашим дебаггером =)
Пример: число 100
Первый случай
1.1 Вход в bin с числом 100
1.2 Присвоение переменной num числа 50 (100 / 2)
(В предыдущем входе осталось число 50, так как поменяли переменную num) 50 % 2 = 0
2.1 Вход в bin с числом 50
2.2 Присвоение переменной num числа 25 (50 / 2)
(В предыдущем входе осталось число 25, так как поменяли переменную num) 25 % 2 = 1
3.1 Вход в bin с числом 25
3.2 Присвоение переменной num числа 12 (25 / 2)
(В предыдущем входе осталось число 12, так как поменяли переменную num) 12 % 2 = 0
...
Второй случай
1.1 Вход в bin с числом 100
2.1 Вход в bin с числом 50 (100 / 2) (В предыдущем входе осталось число 100) 100 % 2 = 0
3.1 Вход в bin с числом 25 (50 / 2) (В предыдущем входе осталось число 50) 50 % 2 = 0
4.1 Вход в bin с числом 12 (25 / 2) (В предыдущем входе осталось число 25) 25 % 2 = 1
...
В первом примере вы изменяете num (делите на 2, если точнее), а значит остаток от деления вы выводите не от вашего num, а от уже измененного.
Ваш первый пример "эквивалентен" (если очень грубо) такому коду:
static void bin(int num){
if (num >= 2){
bin(num / 2);//корректно работает
}
System.out.print((num/2)%2);
}