這聽起來可能很簡單,我嘗試搜索解決方案,但找不到,因此發布了問題。感謝您的幫助,提前致謝。
我正在嘗試使用遞回在 python 中列印給定串列/字串的所有子序列。以下是我期望的輸出:
給定輸入串列:[1,3,2]
輸出串列:[[],[1],[3],[2],[1,2],[1,3],[3,2],[1,3,2]]
這是我嘗試過的:
def printSubsequences(ind,ans,l,n):
final_ans = []
if ind == n:
return ans
else:
ans.append(l[ind])
final_ans.extend(printSubsequences(ind 1,ans,l,n))
ans.pop()
final_ans.extend(printSubsequences(ind 1,ans,l,n))
return final_ans
print(printSubsequences(0,[],[1,3,2],3))
Output of above code: [1, 3, 2, 1, 3, 1, 2, 1, 3, 2, 3, 2]
輸出部分正確,因為它不包含[](空子集),但我希望它采用上述指定格式。我也嘗試過append方法,但那是給Output : [[[[], []], [[], []]], [[[], []], [[], []]]].
我不明白我在這里做錯了什么,有人可以解釋一下 - 為什么append失敗并且extend正在作業,以及如何獲得我想要的輸出?
uj5u.com熱心網友回復:
你遇到了這個經典的python陷阱:
- 意外反映在子串列中的串列更改串列
當您附加ans到結果串列時,它始終是對同一串列的參考ans,而不是副本。因此,當您呼叫 時ans.pop(),您將洗掉該串列的最后一個元素,并在所有子序列中將其洗掉。試試這個代碼:
a = [2]
b = [a, a, a]
print(b) # [[2], [2], [2]]
a.pop()
print(b) # [[], [], []]
解決方法是采用更具功能性的樣式,從不ans就地修改串列,而是在遞回呼叫需要時構建新串列:
def subsequences(ind,ans,l,n):
final_ans = []
if ind == n:
return [ans]
else:
final_ans.extend(subsequences(ind 1,ans [l[ind]],l,n))
final_ans.extend(subsequences(ind 1,ans,l,n))
return final_ans
>>> subsequences(0, [], [1,2,3], 3)
[[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]
值得注意的修改:
- 我重命名了函式
subsequences而不是printSubsequences,因為它不列印; - 我修復了應該是的基本情況
return [ans],而不是return ans; - 我在遞回呼叫中替換了 to
ans.append和ans.popwith的呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344900.html
下一篇:合并排序實作JavaScript
