Вывод функции с двумя последовательными рекурсивными операторами - PullRequest
0 голосов
/ 04 октября 2019

Я изо всех сил пытаюсь понять вывод рекурсивной функции, которая вызывает себя дважды. Я понимаю, что функция с такой структурой вряд ли когда-либо понадобится на практике, но, поскольку я новичок в программировании, я подумал, что для меня было бы полезно немного лучше понять концепцию рекурсии. У меня также (я думаю) нет проблем с пониманием концепции рекурсии в более простом случае, т. Е. Факториала, секвенции Фибоначчи.

Я пробежал это через Python Tutor и попытался использовать отладчик, но ябоюсь, я до сих пор не совсем понимаю, что происходит за кадром.

Я также искал этот сайт, и хотя один или два человека задавали похожие вопросы, приведенные ответы не помогли в моем случае, например, Вызов рекурсивной функции дважды подряд

def recurse(n, s):
    if n == 0:
        print(s)
    else:
        recurse(n - 1, n + s)
        recurse(n - 1, n + 2*s)

recurse(2, 0)

Вот что я думал:

  • recurse (2, 0)

    • 2! = 0, поэтому перейдите к другому:
    • recurse (1,2)

      • 1! = 0, поэтому перейдите к другому:
      • recurse (0, 3)
        • 0 == 0, поэтому выведите (3)
    • recurse (1, 2)

      • 1! = 0, поэтому переходите к другому:
      • recurse (0, 5)
        • 0 == 0, поэтому выведите (5)

Таким образом, я ожидаю вывод 3, 5, но вывод, который я получаю 3, 5, 3, 5

Выполняет ли второй вызов recurse, затем вызывает первый? Я думал, что два последовательных рекурсивных оператора выполняются независимо, но, похоже, это не так.

Любая помощь, указывающая, что именно я не понимаю, будет очень признательна.

1 Ответ

0 голосов
/ 04 октября 2019

Вот что происходит:

  • recurse (2, 0)
    • 2! = 0, поэтому перейдите к другому:
    • recurse (1,2)
      • 1! = 0, поэтому передайте другое:
      • recurse (0, 3)
        • 0 == 0, поэтому выведите (3)
      • recurse (0, 5) // Вы пропустили recurse (n - 1, n + 2 * s)
        • 0 == 0, поэтому напечатайте(5)
    • recurse (1, 2)
      • 1! = 0, поэтому переходите к другому:
      • recurse (0, 3) // Вы пропустили recurse (n - 1, n + s)
        • 0 == 0, поэтому напечатайте (3)
      • recurse (0, 5)
        • 0 == 0, поэтому выведите (5)
...