我正在尝试在折叠地图时为无限循环生成异常。
module X=Map.Make(Int)
问题是这样的:确定函数“f”不会导致无限循环的最大等级。我们有一张地图[(1,2);(2,3);(5,6);(6,7);(7,6)]
该函数遍历所有映射对,如下所示:
对于第一对(1,2)=> f(1)= 2现在我将尝试f(2)= 3(因为它存在于对(2,3)中)现在我将尝试f(3)=>找不到任何键= 3所以等级是我可以调用函数f的次数,在这种情况下,它是2。
对(5,6)=> f(5)= 6我会尝试f(6)= 7(对(6,7)存在)我会尝试f(7)= 6(存在对(7,6))我会尝试f(6)= 7进入一个循环,因为我已经使用了一对(6,7)一次,所以这种情况下的等级是0;
结论:函数f的最大等级如果不进入无限循环,则为2。
如何定义我的异常,以及我可以用什么推理来解决问题?
答案 0 :(得分:3)
花了一些时间来理解这个任务......它基本上类似于World Chain游戏的规则。更科学的描述是:从给定节点开始,找到simple path的长度。
如何定义我的异常
这很简单:
exception Loop_detected
我可以用什么推理来解决问题
检测循环的最简单方法是维护一组所有访问过的节点。很快,当你点击一个已经看过的节点时,你应该豁免Loop_detected
例外,例如if Ints.mem dst visited then raise Loop_detected
。您可以使用以下定义为Ints
创建int
设置模块:
module Ints = Set.Make(Int)
使用一组所有访问过的节点是常见但不是检测循环的唯一方法。您可以使用Tortoise and Hare算法。它也在Stepanov的编程元素书中更正式地描述,在Transformations and their Orbits章节中,可以在线获得。