Как внутренне работает рекурсия в python (исходный код рекурсии)? - PullRequest
0 голосов
/ 28 апреля 2020

Я бы хотел понять внутреннюю работу рекурсии. Могу ли я написать свою собственную рекурсию для python?

Например, теперь у нас есть следующая функция:

def fact(n):
    return n*fact(n)

Как я могу изменить команду возврата и изменить ее функциональность, например следующее:

def fact(n):
    my_return  n*fact(n)

В этом случае я хочу изменить внутреннюю работу return и использовать my_returne, а также при этом я хочу управлять стеком по-другому.

1 Ответ

0 голосов
/ 28 апреля 2020

Если вы хотите понять, как работает Python, я настоятельно рекомендую прочитать документацию для встроенных модулей под заголовком "Language Services" , в частности, * 1004. * и dis модулей. Python предоставляет в качестве импортируемых и Python -управляемых модулей все свои возможности синтаксического анализа. Вы можете видеть, использовать и изменять его синтаксический анализ кода, как он генерирует байт-код, и его выполнение ядра.

Я не уверен, действительно ли это помогает, но RETURN_VALUE это свой собственный код операции в байт-коде Python, так что кроме создания своего собственного байт-кода вручную или использования результатов анализа, вероятно, нет другого способа получить поведение ключевого слова return. Реальная реализация того, как это ведет себя, будет зависеть от реализации (например, CPython может сделать это не так, как в Pypy), так что вам нужно быть более конкретным c в своем вопросе, или просто покопайтесь в их исходном коде для этого кода операции.

Тем не менее, ничто не мешает вам создавать свой собственный стек в виде списка и вставлять / извлекать фреймы стека в него и из него, кроме явного безумия действия. Например,

stack = []

def my_pseudo_func():
    global stack
    args, kwargs = stack[-1]
    x, = args
    # do some stuff
    my_return_result = x + 5
    ###
    stack.pop()
    stack.append(my_return_result)

stack.append(((3,), {}))
my_pseudo_func()
result = stack.pop()
assert result == 8
...