我在我的SML手冊中看到了以下函數,該函數計算特定更改需要特定類型的硬幣數量。 例如change [5,2] 16 =[5,5,2,2,2]
因爲2 5硬幣和3-2金幣一個得到16回溯到標準ML
下面的代碼是一個回溯的方法:
exception Change;
fun change _ 0 = nil|
change nil _ = raise Change|
change (coin::coins)=
if coin>amt then change coins amt
else (coin:: change (coin::coins) (amt-coin))
handle Change=> change coins amt;
它的工作原理,但我不明白究竟怎麼了。 我知道回溯是什麼,我只是不明白這個特定的功能。
到目前爲止我的理解是:如果amt爲0,這意味着我們的變化是計算出來的,沒有什麼可以列入最終列表。
如果我們的'硬幣列表'中沒有更多的硬幣,我們需要返回一步。 這就是我迷失的地方:舉一個異常如何幫助我們回去? 當我看到它,處理程序試圖調用更改函數,但不應該「硬幣」參數爲零?因此進入無限循環?爲什麼它會「返回」;
最後一個條款對我來說很明顯:如果硬幣價值大於剩餘金額要更改的餘額,我們使用剩餘的硬幣來構建更改。如果它小於剩餘的數量,我們將它放在結果列表中。