我想遞回地將串列中的元素反轉為 range ito j。
def revlist(l, i, j):
if not l: # this will be true if l == []
return l
return l[-1:] revlist(l[:-1]) # recursive case
例如 list [1, 2, 3, 4, 5, 6, 7, 8, 9]for i = 2and j = 5will be [1, 5, 4, 3, 2, 6, 7, 8, 9]。
這個怎么做?
uj5u.com熱心網友回復:
如果您堅持遞回實作(在此用例中效率低下且毫無意義,并且限制了可以反轉的串列的大小):
def rev_sublist(xs, i, j):
def rec_rev(ys):
if not ys:
return ys
else:
return [ys[-1]] rec_rev(ys[:-1])
return xs[:i] rec_rev(xs[i:j]) xs[j:]
print(rev_sublist([1, 2, 3, 4, 5, 6, 7, 8, 9], 2, 5))
如果你不喜歡這里的內部函式的想法,邏輯會變得非常復雜,比如:
def rev_sublist(xs, i, j):
if i >= j:
return xs
else:
return rev_sublist(xs[:i] [xs[j-1]] xs[i:j-1] xs[j:], i 1, j)
print(rev_sublist([1, 2, 3, 4, 5, 6, 7, 8, 9], 2, 5))
但如果這是一門編程課,我要求你撰寫一個反轉串列的例程,而你想出了這個,那我就要讓你失望了。
注意:您說“在范圍內i” j- 在 Python 中,范圍通常不包括在內,j并且串列索引從 0 開始。因此,在上面的示例中,輸出將是:
[1, 2, 5, 4, 3, 6, 7, 8, 9]
這與您似乎想要包含j并開始索引的示例不匹配1,這將使您的代碼非常不合 Python,并且從我作為專業軟體開發人員的角度來看是錯誤的。但是,如果您想匹配索引,當然可以輕松更新索引。
另請注意,“范圍”的選擇是您的 - 對于像rev_sublist我認為j包容性這樣的功能不是一個壞主意 - 事實上,我可能更喜歡它。
這是一個沒有遞回的解決方案(使用與上面相同的約定):
def rev_sublist(xs, i, j):
return xs[:i] xs[j-1:i-1:-1] xs[j:]
這很明顯為什么遞回解決方案是一個糟糕的解決方案。
如果我要撰寫這個函式并且界面不是一成不變的,我可能更喜歡:
def rev_sublist(xs, i, j):
return xs[:i] xs[j:i-1:-1] xs[j 1:]
上面的例子會回傳[1, 2, 6, 5, 4, 3, 7, 8, 9]。(另請注意,它與用戶 @MichaelM 獨立提出的解決方案完全相同。這強化了它在 Python 中或多或少明顯實作的想法)
uj5u.com熱心網友回復:
您不需要在這里使用遞回。.reverse()只需對原始串列的一部分使用內置方法。你可以這樣做:
def reverseSlice(lst, i, j):
return lst[:i] lst[j:i-1:-1] lst[j 1:]
lst = [1, 2, 3, 4, 5]
print(reverseSlice(lst, 2, 4)) # => [1, 2, 5, 4, 3]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/522498.html
標籤:Python列表递归撤销
上一篇:在串列中查找短語并獲取索引
