int не перезаписывается, потому что он [int] перераспределяется как автоматическая переменная каждый раз, когда вы вызываете функцию binary()
рекурсивно, поэтому, если вы вызываете его n
раз рекурсивновы фактически выделяете n
различных int
с для remainder
.
Таким образом, это «запоминается», потому что это разные локальные переменные.Распределение обычно производится по стеку вызовов
Как это работает: давайте посмотрим на стек примера: binary(5)
:
|number=5, remainder = 1|
-------------------------
Теперь вы повторно вызываете binary()
с number = 5/2=2
|number=2, remainder = 0|
|number=5, remainder = 1|
-------------------------
и снова с number = 2/2 = 1
сейчас вы повторно вызываете binary()
с number = 5/2=2
и получаете:
|number=1, remainder = 1|
|number=2, remainder = 0|
|number=5, remainder = 1|
-------------------------
Теперь условие останова истиннопотому что number <= 1
-, поэтому вы печатаете number
[который равен 1] и извлекаете первый элемент из стека вызовов:
|number=2, remainder = 0|
|number=5, remainder = 1|
-------------------------
и печатаете 0, так как это остаток вверхустек вызовов.
и проделайте то же самое для следующего «элемента» в стеке вызовов:
|number=5, remainder = 1|
-------------------------
и выведите последний остаток: 1.