跟踪递归硬币更改算法

时间:2014-09-21 15:03:33

标签: algorithm recursion trace coin-change

我试图跟踪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中,由于M = 0,将返回0。我的理解:0返回调用2.然后,从调用2继续,运行以下部分:

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

其中bestNumCoins将取值1.然后,将该值1返回到调用1.然后,从调用1继续,因为numCoins + 1(即2)不是&lt; bestNumCoins(即1),bestNumCoins将保持为1,此值1将成为最终值。首先,我认为2应该是最终值,因为要获得10个单位,需要两个价值5的硬币。

我需要帮助才能搞清楚。我一直在花上几个小时。

1 个答案:

答案 0 :(得分:0)

bestNumCoins意味着是一个局部变量,这意味着对函数的每次调用都有bestNumCoins的单独值。

虽然在呼叫#2 bestNumCoins中设置为1,但在呼叫#1中,其值仍为无穷大。在对#2的调用返回值1时,调用#1中的bestNumCoins将更改为值2(返回值加1)。