[問題] 排列組合的疑問

作者: ptt0720 (濕濕)   2017-06-07 16:21:32
def combos(n, m = 1):
if n < m:
return []
res = [[n]]
for i in range(m, n):
l = [i]
for j in combos(n - i, i):
res += [l + j]
return res
print (combos(5))
我寫題目遇到一題 題目是這樣
假如輸入3 要列出所有相加等於3的情況
[3],[2,1],[1,1,1]
然後爬文看到一個算式比較簡單的寫法
但是還是不太懂
第七行為什麼可以讓迴圈在def執行?
還有他的每一層迭代我也不是很了解
目前只理解到 第一次執行會留下自己的值
接下來把自己的值-1 (ex:3-1=2) 繼續分解2
假如輸入是5呢
[5],[1,4],[1,1,3],[1,1,1,2],[1,1,1,1,1]
接下來的
[1,2,2],[2,3]是如何進行迭代的 我就不太清楚了
希望板上神人們可以指導一下
作者: zerof (貓橘毛發呆雕像)   2017-06-07 16:35:00
遞迴 return list
作者: s860134 (s860134)   2017-06-07 22:13:00
這種動態規劃的真的很燒腦XD 學過還是很難實踐
作者: ides13 (juso)   2017-06-07 22:28:00
第七行遞迴,剛學時也覺得奇怪,反正就是可以不用問為什麼http://www.pythontutor.com/ 把code貼到這執行,看記憶體怎麼被使用的,就可以了解了。不過,我試了還是不怎麼懂要靜下心來慢慢想。另外,5改成3吧,不然步驟太多了。剛剛看圖時發現,function object是一開始就準備好了。進行for迴圈後,形成了3個combos再慢慢return。

Links booklink

Contact Us: admin [ a t ] ucptt.com