2013-10-24 115 views
1

我在嘗試學習有關Python 3.x的動態編程和遞歸。下面的代碼是一個簡單的例子,從我的教科書:列表解析的解釋

def recMC(coinValueList, change): 
    minCoins = change 
    if change in coinValueList: 
     return 1 
    else: 
     for i in [c for c in coinValueList if c <= change]: 
      numCoins = 1 + recMC(coinValueList, change-i) 
      if numCoins < minCoins: 
       minCoins = numCoins 
     return minCoins 

print(recMC([1,5,10,25], 63)) 

我真的很努力去理解第6行這裏,行理解。我完全不確定這裏發生了什麼,以及如何將它分解成循環以便更容易理解。這是我的想法,因爲它代表:

for i in c: 
    for c in coinValueList: 
     if c<= change: 

但我不明白這是如何迭代通過。也許有更好的知識的人可以用不同於我的書和教授的方式來解釋這一點?

回答

1
for i in [c for c in coinValueList if c <= change]: 

是一樣的:

列表理解是代碼更容易,更好地閱讀。
列表理解是「python-way」。

+1

'list'對變量名來說是一個糟糕的選擇,因爲它會隱藏內建的'list()'方法。 –

+0

@BurhanKhalid - 是的,你是對的!我用「硬幣」取代了「名單」 –

1

讓我解釋一下

[c for c in coinValueList if c <= change] 

coinValueList創建值新的列表,其小於change內 這個你迭代新名單之後。

N.B.如果你堅持使用理解那裏考慮發電機聲明它將以相同的方式,但沒有內存消耗。

所以導致for循環應不

for i in c: 
    for c in coinValueList: 
     if c<= change: 

for i in coinValueList: 
    if i<= change: