Saint
для чего служит параметр “асс”…
Это накопитель (accumulator), в нём накапливается результат, который потом и возвращается. Накопитель используется для того, чтобы рекурсия была хвостовой. Хвостовая рекурсия даёт возможность компилятору неявно оптимизировать вызовы таким образом, чтобы потребление оперативной памяти не росло при каждом вызове, а оставалось постоянным. Если же рекурсия не хвостовая, то каждый новый вызов ложится рядом с предыдущим, а не вместо него, и таким образом потребляется всё больше и больше памяти.
>>> def f(n, base, acc):
... if n == 0:
... return acc
... return f(n // base, base, [n % base] + acc)
...
>>> f(12345, 16, [])
[3, 0, 3, 9]
>>> f(123451234512345, 16, [])
[7, 0, 4, 7, 3, 10, 15, 10, 14, 13, 13, 9]
>>>
>>> import math
>>>
>>> def f(n, base, acc):
... if n == 0:
... return acc
... return f(n // base, base, [n % base] + acc)
...
>>> f(math.factorial(3000), 16, [])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in f
File "<stdin>", line 4, in f
File "<stdin>", line 4, in f
...
В обычном питоне, конечно, нет таких оптимизаций, но в других языках есть. Да и в самом питоне, вроде, есть компилятор, где есть оптимизации эти. Поэтому надо сразу приучаться писать хвостовую рекурсию, так как она может быть бесконечной в отличие от не хвостовой.
tags: recursion