2014-01-21 3 views
0

Я пытаюсь понять, почему рекурсивная функция возвращает 1003 вместо 1005.Почему рекурсивная функция возвращает это значение?

l = [1,2,3] 
def sum(l): 
    x, *y = l 
    return x + sum(y) if y else 1000 

sum(l) 

Согласно pythontutor последнее значение y списка 5, и что бы возвращаемое значение 1000 + sum([2,3]) 1005, я правильно?

enter image description here

+0

Что такое этот синтаксис: 'x, * y = l'? это python 3? – Elisha

+1

@ Elisha он распакует остальную часть l на y. –

+0

Я догадался, но это не работает на python2.7. Я думаю, что лучше добавить тег 'python3' – Elisha

ответ

3

Согласно pythontutor последнее значение y list равно 5, и это сделает возвращаемое значение 1000 + sum([2,3]) 1005, правильно ли?

Нет, последнее значение y - []. Это ни что иное, как список, и, кроме того, для него никогда не было 5. Кроме того, рекурсивное возвращаемое значение всегда справа от +, только слева находится x.

Давайте шаг через него:

sum([1, 2, 3]) = 1 + sum([2, 3]) 
sum([2, 3]) = 2 + sum([3]) 
sum([3]) = 1000 

Таким образом, подставляя обратно:

sum([2, 3]) = 2 + 1000 = 1002 
sum([1, 2, 3] = 1 + 1002 = 1003 

Проблема заключается в том, что, когда y пуст, вы возвращение 1000, не x + 1000.

Ваше замешательство может быть просто вопросом приоритета. Может быть, вы ожидали, это:

return x + sum(y) if y else 1000 

... иметь в виду, это:

return x + (sum(y) if y else 1000) 

... но на самом деле, это означает следующее:

return (x + sum(y)) if y else 1000 
2

рекурсии шаг за шагом

1) x = 1y = [2,3]

2) x = 2y = [3]

3) x = 3y = []

Обратите внимание, что шаг 3) возвращает 1000 с not y. Это происходит потому, что ваше возвращение утверждение эквивалентно

(x + sum(y)) if y else 1000 

Таким образом, мы имеем

3) 1000

2) 1000 + 2

1) 1002 + 1

Результат является 1003.

Так что, возможно, что вы ищете:

return x + sum(y) if y else 1000 + x 

или (копируется из ответа НДПУ в):

return x + (sum(y) if y else 1000) 

(принять x во внимание в последней стадии)

+0

Я не понимаю, как 'x' становится' 3' в конечном итоге. Потому что на каждой итерации мы присваиваем значение 'x' до следующего значения' l'. 'x' поднимается до' 3'. Как функция может запомнить значение 'x'? – minerals

+0

и почему у нас есть 1000 + 2 и 1002 + 1 на шаге 2) и 1) соответственно? Я думал, что мы должны получить только 2 и 1, так как условие 'else' не запускается на этом этапе. – minerals

+1

@minerals Это рекурсия. Значение на шаге 2 представляет собой значение с шага 3 (т.е. 1000) + x, которое равно 2. Значение на шаге 1 является значением с шага 2, то есть 1002 + x, равным 1. Что касается первого вопроса: на третьем этапе вы call 'sum ([3])' so 'x, * y = [3]' производит 'x = 3' и' y = [] '. Я не уверен, что вы подразумеваете под «поднятым до« 3 ». – freakish

1

Вы должны попытаться использовать отладчик или на самом деле печатать вещи внутри функции. Без выполнения кода я думаю, что это должно быть что-то вроде этого:

l = [1,2,3] 
def sum(l): 
    x, *y = l 
    return x + sum(y) if y else 1000 

sum(l) 

Это будет вызывать такие:

-> sum([1,2,3]) 
x : 1 
y : [2, 3] 
-> sum([2, 3]) 
x: 2 
y: [3] 
-> sum([3]) 
x: 3 
y: [] 
returns 1000 
returns 2 + 1000 
returns 1 + 1002 
+0

Он уже пытался использовать интерактивный пошаговый визуализатор и не мог понять, что он показывал ему; Я не уверен, что отладчик типа «pdb», который имеет такую ​​же информацию менее доступным для новичков, поможет ... – abarnert

2

Вы должны добавить круглые скобки:

l = [1,2,3] 
def sum(l): 
    x, *y = l 
    return x + (sum(y) if y else 1000) 
Смежные вопросы