我在我的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,这意味着我们的变化是计算出来的,没有什么可以列入最终列表。
如果我们的'硬币列表'中没有更多的硬币,我们需要返回一步。 这就是我迷失的地方:举一个异常如何帮助我们回去? 当我看到它,处理程序试图调用更改函数,但不应该“硬币”参数为零?因此进入无限循环?为什么它会“返回”;
最后一个条款对我来说很明显:如果硬币价值大于剩余金额要更改的余额,我们使用剩余的硬币来构建更改。如果它小于剩余的数量,我们将它放在结果列表中。