我试图跟踪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的硬币。
我需要帮助才能搞清楚。我一直在花上几个小时。
答案 0 :(得分:0)
bestNumCoins
意味着是一个局部变量,这意味着对函数的每次调用都有bestNumCoins
的单独值。
虽然在呼叫#2 bestNumCoins
中设置为1,但在呼叫#1中,其值仍为无穷大。在对#2的调用返回值1时,调用#1中的bestNumCoins
将更改为值2(返回值加1)。