2014-09-21 78 views
0

我想跟蹤M = 10,c = {5,3,1}和d = 3的硬幣更改問題的遞歸算法。 M是需要變更的貨幣的價值,c是可用的不同硬幣值,d是可用的不同硬幣值的數量。我很困惑如何追蹤它。跟蹤遞歸硬幣更改算法

RecursiveChange(M,C,d)

if M = 0 
    return 0 
bestNumCoins <- infinity 
for i -> 1 to d 
    if M ≥ c(i) 
     numCoins <- RecursiveChange(M – c(i) , c, d) 
     if numCoins + 1 < bestNumCoins 
      bestNumCoins <- numCoins + 1 
    return bestNumCoins 

呼叫1:RecursiveChange(10,{5,3,1},3)

呼叫2:RecursiveChange(5,{ 5,3,1},3)

呼叫3:RecursiveChange(0,{5,3,1},3)

在呼叫3,0將由於M = 0返回。我明白了什麼:0被返回給調用2.然後,從呼叫2繼續進行,下面的部分是運行:

if numCoins + 1 < bestNumCoins 
       bestNumCoins <- numCoins + 1 
     return bestNumCoins 

其中bestNumCoins將採取1值1這個值,然後返回到調用1然後,繼續從第一個電話號碼開始,由於numCoins + 1(即2)不是< bestNumCoins(即1),所以bestNumCoins將保持爲1,並且此值爲1將成爲最終值。首先,我認爲2應該是這裏的最終價值,因爲要獲得10個單位,需要兩個價值5的硬幣。

我需要幫助弄清楚,請。我一直在這上面花費數小時。

回答

0

bestNumCoins意思是一個局部變量,這意味着對該函數的每個調用都有其自己的單獨值bestNumCoins

儘管在呼叫#2中bestNumCoins設置爲1,在呼叫#1中它的值仍然保持無窮大。呼叫#2返回值1後,呼叫#1中的bestNumCoins將更改爲值2(返回的值加1)。