请考虑这段通用代码:
for j = 0 to (Array.length myArray) - 1 do
if property.(id) then
(* do a bunch of stuff*)
done
这里,property
是一个非常大的布尔数组。在这个实验中,我们有两种情况:
在第1,
property.(id)
总是true第二种
property.(id)
可以为true或false
我们希望第二种情况获胜,因为它跳过了代码执行。但这并不是因为分支条件作用。我们也尝试用property
来代替if
语句,但是第一种情况仍然胜出。(这些都是OCaml社区成员的建议)。
我们的问题定义是:我们可以检测到允许我们跳过部分代码的属性。但是,使用一个大的布尔数组来保存哪个元素具有此属性会使检查属性本身的速度比保存代码的执行速度慢。
因此,现在的问题更一般:实现这个问题的更好方法是什么?我们非常感谢来自社区的任何建议
在我看来,有两种可能的解决方案:
-
如果你仍然想使用for循环,那么我建议使用exception来退出for循环
exception YourExn of something try for j = 0 to (Array.length property) - 1 do if property.(id) then (* do a bunch of stuff*) else raise (YourExn result) done with YourExn res -> (* do something *)
-
另一个解决方案是只写一个递归函数,而不是使用for循环。我建议使用这种解决方案,因为使用递归函数是函数式编程的一种标准。
let rec traverse property id = if id > (Array.length property) then (* exit *) else if property.(id) then (* do a bunch of stuff*) traverse property (id + 1) else (* exit *) in traverse property 0
在这里阅读类似的问题后,为什么处理排序数组比未排序数组更快?对于我的代码,最好的解决方案是编写一个无分支的条件,如第节所建议的,那么可以做些什么呢?