这里的呼叫change [5,2] 16
一个执行跟踪,到handle
左 的部分代表什么功能迄今计算,而右边的部分 是继续通过被请求时,回溯与国家Change
信号。
> change [5, 2] 16
> 5 :: change [5, 2] (16 - 5) handle Change: change [2] 16
> 5 :: change [5, 2] 11 handle Change: change [2] 16
> 5 :: 5 :: change [5, 2] (11 - 5) handle Change: 5 :: change [2] 11
> 5 :: 5 :: change [5, 2] 6 handle Change: 5 :: change [2] 11
> 5 :: 5 :: 5 :: change [5, 2] (6 - 5) handle Change: 5 :: 5 :: change [2] 6
> 5 :: 5 :: 5 :: change [5, 2] 1 handle Change: 5 :: 5 :: change [2] 6
> 5 :: 5 :: 5 :: change [2] 1
> 5 :: 5 :: 5 :: change nil 1
> raise Change => 5 :: 5 :: change [2] 6
> 5 :: 5 :: 2 :: change [2] (6 - 2) handle Change
> 5 :: 5 :: 2 :: change [2] 4 handle Change
> 5 :: 5 :: 2 :: 2 :: change [2] (4 - 2) handle Change
> 5 :: 5 :: 2 :: 2 :: change [2] 2 handle Change
> 5 :: 5 :: 2 :: 2 :: 2 :: change [2] (2 - 2) handle Change
> 5 :: 5 :: 2 :: 2 :: 2 :: change [2] 0 handle Change
> 5 :: 5 :: 2 :: 2 :: 2 :: nil
> [5, 5, 2, 2, 2]
正如你所看到的,变化异常被捕获时,则算法进行退二 堆栈帧,从结果列表下降到第三5硬币和递归只用 2硬币硬币的名单。量也恢复到6
第一行,handle
之前的部分尝试使用另外5为可能的 分解,而异常处理程序代表回溯期权, 即,除去5我们刚刚试图调整硬币清单和其余的 金额。
最后一行表示上次安装的异常处理程序回溯。
> 5 :: 5 :: 5 :: change [5, 2] 1 handle Change: 5 :: 5 :: change [2] 6
> 5 :: 5 :: 5 :: change [2] 1
> 5 :: 5 :: 5 :: change nil 1
> raise Change => 5 :: 5 :: change [2] 6
换句话说,当它到达这里没有更多的 硬币类型可供选择的状态,但金额仍然是积极的算法回溯。这是贪婪的 ,因为算法将使用相同的硬币,直到它发现异常。
异常处理程序附加到else
表达式,因为它是 作出的贪婪选择。
希望我能理解我的解释。