В настоящее время я изучаю CS61A и выполняю задания по следующим темам.
Проблема описана следующим образом.
Я дал первое решение.
Но оно вызвал ошибку RecursionError.
def stair_ways(n):
"""
Yield all the ways to climb a set of n stairs taking
1 or 2 steps at a time.
>>> list(stair_ways(0))
[[]]
>>> s_w = stair_ways(4)
>>> sorted([next(s_w) for _ in range(5)])
[[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2]]
>>> list(s_w) # Ensure you're not yielding extra
[]
"""
if n == 0:
yield []
if n == 1:
yield [1]
else:
for i in stair_ways(n-1):
yield [1]+i
for i in stair_ways(n-2):
yield [2]+i
n=4
result = stair_ways(n)
print([next(result) for i in range(5)])
Traceback (most recent call last):
File "E:\Code\CS61A\test.py", line 150, in
print([next(result) for i in range(5)])
^^^^^^^^^^^^
File "E:\Code\CS61A\test.py", line 143, in stair_ways
for i in stair_ways(n-1):
File "E:\Code\CS61A\test.py", line 143, in stair_ways
for i in stair_ways(n-1):
File "E:\Code\CS61A\test.py", line 145, in stair_ways
for i in stair_ways(n-2):
File "E:\Code\CS61A\test.py", line 143, in stair_ways
for i in stair_ways(n-1):
File "E:\Code\CS61A\test.py", line 143, in stair_ways
for i in stair_ways(n-1):
File "E:\Code\CS61A\test.py", line 143, in stair_ways
for i in stair_ways(n-1):
[Previous line repeated 993 more times]
RecursionError: maximum recursion depth exceeded
Затем я изменил оператор if на оператор elif и получил правильный результат.
def stair_ways(n):
if n == 0:
yield []
elif n == 1:
yield [1]
else:
for i in stair_ways(n-1):
yield [1]+i
for i in stair_ways(n-2):
yield [2]+i
n=4
result = stair_ways(n)
print([next(result) for i in range(5)])
Поэтому мне интересно, почему это изменение заставило программу дать правильный ответ.
Спасибо!
Что случилось с программой, когда Я изменил оператор if на оператор elif, который дал правильный ответ.
В настоящее время я изучаю CS61A и выполняю задания по следующим темам. Проблема описана следующим образом. Я дал первое решение. Но оно вызвал ошибку RecursionError. [code]def stair_ways(n): """ Yield all the ways to climb a set of n stairs taking 1 or 2 steps at a time.
>>> list(stair_ways(0)) [[]] >>> s_w = stair_ways(4) >>> sorted([next(s_w) for _ in range(5)]) [[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2]] >>> list(s_w) # Ensure you're not yielding extra [] """ if n == 0: yield [] if n == 1: yield [1] else: for i in stair_ways(n-1): yield [1]+i for i in stair_ways(n-2): yield [2]+i
n=4 result = stair_ways(n) print([next(result) for i in range(5)]) [/code] [code]Traceback (most recent call last): File "E:\Code\CS61A\test.py", line 150, in print([next(result) for i in range(5)]) ^^^^^^^^^^^^ File "E:\Code\CS61A\test.py", line 143, in stair_ways for i in stair_ways(n-1): File "E:\Code\CS61A\test.py", line 143, in stair_ways for i in stair_ways(n-1): File "E:\Code\CS61A\test.py", line 145, in stair_ways for i in stair_ways(n-2): File "E:\Code\CS61A\test.py", line 143, in stair_ways for i in stair_ways(n-1): File "E:\Code\CS61A\test.py", line 143, in stair_ways for i in stair_ways(n-1): File "E:\Code\CS61A\test.py", line 143, in stair_ways for i in stair_ways(n-1): [Previous line repeated 993 more times] RecursionError: maximum recursion depth exceeded
[/code] Затем я изменил оператор if на оператор elif и получил правильный результат. [code]def stair_ways(n): if n == 0: yield [] elif n == 1: yield [1] else: for i in stair_ways(n-1): yield [1]+i for i in stair_ways(n-2): yield [2]+i
n=4 result = stair_ways(n) print([next(result) for i in range(5)]) [/code] [code]>>> [[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2]] [/code] Поэтому мне интересно, почему это изменение заставило программу дать правильный ответ. Спасибо! Что случилось с программой, когда Я изменил оператор if на оператор elif, который дал правильный ответ.