我正在嘗試將此迭代函式轉換為遞回函式。該函式接受一個整數 x 和整數串列。for回圈洗掉串列中的一個元素
def function(x, arr):
for v in arr:
if v % x == 0:
arr.remove(v)
return arr
我嘗試這樣做,但似乎不起作用:
out = []
def removeMultiples(x, arr):
if len(arr) < 1:
return arr
else:
if arr[0] % x == 0:
out.append(arr[0])
return out removeMultiples(x, arr[1:])
else:
return out removeMultiples(x, arr[1:])
uj5u.com熱心網友回復:
此函式的迭代版本可以使用串列理解
def function(x, arr):
return [i for i in arr if i % x != 0]
遞回版本可能看起來像這樣
def removeMultiples(x, arr):
if not arr:
return []
current, rest = arr[0], arr[1:]
if current % x != 0:
return [current] removeMultiples(x, rest)
else:
return removeMultiples(x, rest)
例如
>>> values = [1,2,3,4,5,6,7,8]
>>> function(2, values)
[1, 3, 5, 7]
>>> removeMultiples(2, values)
[1, 3, 5, 7]
請注意,這兩個版本都會創建并回傳一個新串列,而不是從現有串列中洗掉元素。
uj5u.com熱心網友回復:
您可以讓您的函式處理第一個元素并遞回處理其余元素,直到串列中沒有更多元素。
def removeMultiples(x,arr):
return arr[:1]*bool(arr[0]%x) removeMultiples(x,arr[1:]) if arr else []
r = removeMultiples(3,[2,5,6,4,12,7])
print(r)
[2, 5, 4, 7]
如果您更喜歡避免 Python 的遞回深度限制并且不制作串列副本的更精細的解決方案,您可以使用子范圍并將串列從中間拆分以遞回兩次,從而消除左側和右側的 x 倍數。然后把兩個清理過的邊放在一起:
def removeMultiples(x,arr,start=0,end=None):
if end is None: end = len(arr)
if end-start <= 1:
return arr and arr[start:end]*bool(arr[start]%x)
mid = (start end)//2
return removeMultiples(x,arr,start,mid) removeMultiples(x,arr,mid,end)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344906.html
下一篇:如何列印所有結果?
