【问题标题】:OCaml : Infinite LoopOCaml:无限循环
【发布时间】:2021-04-14 04:33:34
【问题描述】:

我正在尝试执行这个简单的 while 循环,但它不起作用。编译器没有给出任何类型的错误或警告,但是当我尝试运行我的函数时,它会进入无限循环:

let example x =
  let k = ref x in 
  while (!k > 42) do
    if ( (!k mod 5) == 0) then (
      k:= !k/2
    );
  done;
 if(!k<42) then (
   Printf.printf "k is less than 42"  
  );
  if(!k == 42) then (
    Printf.printf "k is equal to 42" 
  )
;;

【问题讨论】:

  • k = 43,然后..?
  • @user2864740 抱歉,我刚刚添加了我只是想简化的其余代码
  • 遵循代码的逻辑,而k 大于 42,k 只有在它是 5 的倍数时才会更新。似乎有 很多 k 永远不会在循环中更新的情况。编辑:我看到了 Jeffrey Scofield 的回答。

标签: while-loop ocaml infinite-scroll


【解决方案1】:

好吧,您的循环仅在 !k mod 5 = 0 时修改 !k。如果!k 不能被 5 整除,则它的值永远不会改变。这表明循环将运行 0 次或将运行无限次。

您没有显示对example 的任何调用,但在我看来,任何传递值 > 42 而不是 5 的倍数的调用都应该无限循环。

顺便说一句,这就是@user2864740 试图指出的。 43 是一个大于 42 且不能被 5 整除的值。

(作为旁注,您应该使用= 来比较值是否相等。OCaml 中的== 运算符在有限的情况下很有用。这通常会给来自其他语言的人带来问题。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多