无限循环异常

时间:2016-10-26 15:58:44

标签: ocaml

我正在尝试在折叠地图时为无限循环生成异常。

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。

如何定义我的异常,以及我可以用什么推理来解决问题?

1 个答案:

答案 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章节中,可以在线获得。