Понять, где общее значение хранится в рекурсивной функции - Python - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь понять, где хранится общее значение, например, возвращением этой функции является int 15. Каждое число из списка ввода берется и добавляется по одному и удаляется из списка, но я не вижу, где хранится временное значение. Я получаю только полную сумму?

Также относительно return L[0] + mysum(L[1:]), если mysum(L[1:]) сохраняет список, как его можно добавить с помощью L[0], и если mysum(L[1:]) не хранит список, где хранится список, не потерян ли он, и тогда, конечно, программа не будет знать, какие номера добавить дальше?

код

def mysum(L):
    print(L) # Trace recursive levels
    if not L: # L shorter at each level
        return 0
    else:
        return L[0] + mysum(L[1:])

total = mysum([1, 2, 3, 4, 5])

print("Total = ", total)

возврат

[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
Total =  15

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Промежуточные промежуточные итоги никогда не «сохраняются» в переменной - они передаются в стек вызовов каждый раз, когда возвращается один из рекурсивных вызовов:

  • Первый рекурсивный вызов для возврата - mysum([]) который возвращает число 0.
  • После этого рекурсивный вызов mysum([5]) возвращает 5 + 0 = 5.
  • После этого рекурсивный вызов mysum([4,5]) возвращает 4 + 5 = 9.
  • Затем рекурсивный вызов mysum([3,4,5]) возвращает 3 + 9 = 12.
  • Затем mysum([2,3,4,5]) возвращает 2 + 12 = 14.
  • Затем, наконец, исходныйрекурсивный вызов mysum([1,2,3,4,5]) возвращает 1 + 14 = 15.

У меня есть интерактивная демонстрация , которая показывает, как некоторые рекурсивные функции вычисляются поэтапно с использованием стека вызовов. Это может помочь вам понять, как выполняются рекурсивные функции.

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

Значение «сохраняется» с учетом того факта, что перед возвратом выражения необходимо вычислить обе стороны.

В вашем примере при первом вызове последним «возвратом» будет «возврат 1 +»mysum ([2, 3, 4, 5]) ", тогда mysum будет оцениваться, он будет оцениваться как" return 2 + mysum ([3, 4, 5]) ".

Наконец, когдаВы достигли конца списка, mysum вернет 0, поэтому будет "return 1 + 2 + 3 + 4 + 5 + 0".

...