2017-02-13 13 views
3

Я довольно смущен приведенным ниже кодом.
как переменные хранятся и обрабатываются в функции рекурсии в python?

def a(x): 
    print(x)  
    if x > 0: 
     a(x - 1) 
    print(x) #I am confused with this print statement 

a(5) 

Вышеприведенный код выход:

5 
4 
3 
2 
1 
0 
0 
1 
2 
3 
4 
5 

Up до 0 Я понимаю, как он печатает, но тогда почему он печатает в порядке возрастания.
Переменная x меняется так, что я думал, что выход будет Последнее присвоенное значение x, то есть 0.
Мои предсказали выход:

5 
4 
3 
2 
1 
0 
0 
0 
0 
0 
0 
0 

Так как же это трек значение х ...?
Может кто-то объяснить вкратце, что на самом деле происходит в рекурсивных функций и как переменные, хранящиеся в нем.

+0

Никакая переменная 'x' не изменяется: каждый вызов функции имеет свой собственный' x'. –

+1

Это не имеет ничего общего с рекурсивной функцией. Вызов функции с помощью 'x - 1' не изменяет значение' x' в текущей области. Вы можете найти http://pythontutor.com/ полезным. – jonrsharpe

+1

Похоже, вы должны немного прочитать о стеке, например здесь: https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html - это то, как функции хранят свои локальные переменные , возвращаемые значения и т. д. –

ответ

6

Вы должны понимать, что для каждого вызова функции x является местным. Таким образом, это означает, что второй звонок fимеет разные x. Чтобы представить себе это: вы можете видеть, что нравится:

f(x=5) 
    print(x) # this x = 5 
    f(x=4) 
     print(x) # this x = 4 
     f(x=3) 
      print(x) # this x = 3 
      f(x=2) 
       print(x) # this x = 2 
       f(x=1) 
        print(x) # this x = 1 
        f(x=0) 
         print(x) # this x = 0 
         print(x) # this x = 0 
        print(x) # this x = 1 
       print(x) # this x = 2 
      print(x) # this x = 3 
     print(x) # this x = 4 
    print(x) # this x = 5 

Так что в ваших рекурсивных вызовах, есть шесть x эсов. Каждый из x переменных могут имеют различное значение и изменение их на один уровень глубже не оказывает никакого влияния на уровень выше и т.д.

+0

top ответ чувак :) – WhatsThePoint

4

Для каждого вызова, функция создает новую переменную x и выводит соответствующее значение x в который он назвал.

Так что для каждого момента, когда вызывается функция, создается новая копия этой функции, поэтому значение x в этой области. Таким образом, вы фактически создаете шесть x с соответствующим значением.

3

Адрес a(5) начнет функционировать a() с x = 5. Это будет делать три вещи:

  1. Первая печать х (что имеет значение 5)
  2. Затем вызовите a(4)
  3. Затем (после того, как все остальное) печать снова х (который по-прежнему имеет значение 5).

Шаг 2 просто немного сложный, потому что он также выполнит эти три шага (дважды нажмите «4» и вызовите a(3) между ними). Это будет уменьшаться до тех пор, пока не будет выдан a(0), который будет печатать только 0 дважды, но не снова вызывает a().

2

Позвольте мне попытаться объяснить.a (4), a (3), a (2) и a (1) называются рекурсивно, поскольку они попадают в оператор if, поэтому в стеке (5) находится внизу, а (1) сверху , так как они сложены снизу вверх

def a(x): 
    print(x) # executed  
    if x > 0: 
     a(x - 1) #executed 
    print(x)  

Результат: 5,4,3,2,1

Когда (0) называется, он не попадает в, если заявление, следовательно, он печатает 0 дважды. ТОЛЬКО a (0) выполняется до завершения, (1) - (5) еще не закончили выполнение, так как они все еще находятся в стеке.

def a(x): 
    print(x) #executed 
    if x > 0: 
     a(x - 1) 
    print(x) #executed 

Результат: 0, 0

Как мы закончим выполнение этих вызовов функций? Мы должны вытащить их из стека. Напомним, я упомянул, что (5) находится внизу, а (1) сверху. Стеки выскакивают сверху вниз, поэтому, когда возвращается (0), он вызывает (1) и (1) завершает выполнение своего последнего оператора. После того, как вызывается (1), вызывается (2) и так далее.

def a(x): 
    print(x)  
    if x > 0: 
     a(x - 1) 
    print(x) #executed 

Результат: 1,2,3,4,5

Стек теперь полностью выскочил.

1

Это относится к стеку.
для каждого вызова создается другое x, и поэтому значение x получает отпечатки в порядке возрастания.

 Смежные вопросы

  • Нет связанных вопросов^_^