我需要撰寫一個接收非負整數并回傳的函式:
[] for n=0
[[]] for n=1
[[],[[]]] for n=2
[[],[[]],[[],[[]]]] for n=3
等等。對于n,我們將收到一個n大小的串列,因此在 indexi中將i-1包含串列中的所有元素。我不知道如何更好地解釋,英語不是我的第一語言。
我不允許使用串列切片或回圈,我應該在沒有copy模塊的情況下創建每個串列的深層副本。我不允許讓 2 個不同的串列或索引指向記憶體中的同一個串列。
這是我嘗試過的:
def list_seq(x, outer_list=[]):
if x == 0:
return []
outer_list.append(list_seq(x-1,outer_list))
return outer_list
的輸出print(list_seq(2))是[[], [...]]。
uj5u.com熱心網友回復:
如果您不能使用回圈,則可以使用以下內容:
def recursive_list(n):
if n == 0:
return []
else:
return recursive_list(n-1) [recursive_list(n-1)]
建議使用caching。一個cached版本將是(使用functools.cache)
from functools import cache
@cache
def recursive_list(n: int) -> list:
if n:
return recursive_list(n-1) [recursive_list(n-1)]
return []
編輯
如果要使用,可以執行以下操作append:
def recursive_list(n: int) -> list:
if n:
result = recursive_list(n-1)
result.append(recursive_list(n-1))
return result
return []
但是,如果您計劃cache獲得結果,則方法需要稍有不同。盡管可以使用list.append代替來做到這一點__add__,但問題是append就地修改串列,這可能會導致一些意想不到的結果。為了避免這種情況,您每次都需要對中間結果進行切片,以確保copy串列而不是views。
@cache
def recursive_list(n: int) -> list:
if n:
result = recursive_list(n-1)[:]
result.append(recursive_list(n-1))
return result
return []
uj5u.com熱心網友回復:
您可以使用簡單的串列推導式將其寫為遞回函式:
def f(n):
return [f(i) for i in range(n)]
但是請注意,如果沒有快取,它會變得相當緩慢相當快。
uj5u.com熱心網友回復:
另一種更短的遞回解決方案,沒有回圈:
def l_list(n):
def f(c, d = []):
return d if c == n else f(c 1, d [l_list(c)])
return f(0)
print(l_list(0))
print(l_list(1))
print(l_list(2))
print(l_list(3))
輸出:
[]
[[]]
[[], [[]]]
[[], [[]], [[], [[]]]]
uj5u.com熱心網友回復:
只是另一個想法,我認為它滿足所有規則/要求:
def f(n):
a = []
exec('a.append(1 * a);' * n)
return eval(repr(a))
演示用法:
for n in range(5):
print(f(n))
輸出:
[]
[[]]
[[], [[]]]
[[], [[]], [[], [[]]]]
[[], [[]], [[], [[]]], [[], [[]], [[], [[]]]]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368104.html
下一篇:練習多重組合,串列中的函式
