Путаница в рекурсивной программе python - PullRequest
0 голосов
/ 11 марта 2020

Эй, ребята, кто-нибудь может объяснить мне этот вывод?

Не понимаю, почему его обратный отсчет снова.

def kaboom(i):
    print("first Print: ", i)
    if i < 3:
        kaboom(i+1)
    print("second Print: ", i)

ВЫХОД:

first Print:  1
first Print:  2
first Print:  3
second Print:  3
second Print:  2
second Print:  1

Ответы [ 5 ]

3 голосов
/ 11 марта 2020

Second Print ведет обратный отсчет, потому что для каждого вызова, который вы делаете kaboom (i + 1), этот вызов помещается на вершину стека вызовов. Как только я> = 3, стек перестает расти, и вызовы отбрасываются с того места, где они прекратились. Итак, 3 печатается, и выполнение kaboom (2 + 1) заканчивается. Затем вызов kaboom (1 + 1) возобновляется с того места, на котором он остановился, и печатает 2 и завершается. Наконец, kaboom (1) возобновляет и печатает 1.

3 голосов
/ 11 марта 2020

ваша функция diving для самого дальнего вызова, затем возвращается и печатает second Print

call 1 --> i = 1             back to call 1 --> second Print, i it is still 1
    ↓                        ↑
    call 2 --> i = 2         back to call 2 --> second Print, i it is still 2 
    ↓                        ↑
    cal 3 --> i = 3 (end of call chain, it goes back)
1 голос
/ 11 марта 2020

Думайте об этом так: вы создаете новое вхождение kaboom каждый раз, когда он вызывается. в первый раз kaboom называется я один. Сначала печатается и вызывается kaboom (2). Сначала печатается и вызывается kaboom (3). Сначала печатается, и kaboom больше не вызывается, потому что я = 3. НО kaboom (3), kaboom (2) и kaboom (1) еще не завершены, потому что они все еще должны печатать во второй раз. Поскольку kaboom (3) был открыт совсем недавно, он должен закрываться первым, поэтому вторая 3 печатается первой. Затем kaboom (2) печатает вторую 2 и, наконец, kaboom (1) наконец завершает, наконец печатая вторую 1.

1 голос
/ 11 марта 2020

Чтобы понять это, вам нужно понять, как работает рекурсия. Работает по концепции стеков. Вы можете взглянуть на следующую ссылку, чтобы получить четкое представление: https://www.freecodecamp.org/news/how-recursion-works-explained-with-flowcharts-and-a-video-de61f40cb7f9/

Вы снова вызываете ту же функцию, если i<3, поэтому она печатает первую печать и так на .. но после того, как это возвращено, выполнение не закончится там правильно. Это должно выполнить остальную часть метода, который является вторым выводом.

1 голос
/ 11 марта 2020

стратегия рекурсии использует стеки, которые работают как Last In First Out. В вашем случае, если я прав, ваше базовое условие удовлетворяется только в 3, и до тех пор, пока оно не сохранится в стопке, а затем будет напечатано.

...