OCaml-拒绝负数

时间:2018-09-28 16:55:46

标签: while-loop ocaml

我想创建一个将两个整数相加的程序。但是,它们都必须是积极的。 我想写这样的东西:

let n = read_int ()

while n<=0 do
    let n = read_int ()
    done

因此它将再次读取该数字,直到检查它是否为正。

正确的方法是什么?

2 个答案:

答案 0 :(得分:0)

您的代码在语法上不是有效的,但是即使它是有效的,它也基于更改变量值的想法,而这在OCaml中是不可能的。

在命令式编程中,您可以更改n的值,直到看起来像您想要的为止。但是,OCaml是一种功能语言,其变量永久绑定到一个值。

n中显示的while n < = ...n中显示的let n = read_int ()不同。关键字let引入了一个新的局部变量。

可以想象编写一个递归函数,该函数返回使用read_int读取的下一个非负值。如果没有很好的价值,它可以递归调用自己。

答案 1 :(得分:0)

要添加到其他答案中,可以完成工作的递归函数应如下所示:

let rec read_next_non_negative_int () =
  let n = read_int () in
  if n < 0 then
    read_next_non_negative_int ()
  else
    n

让我们弄清楚它是如何工作的。它读取整数n。如果n为负数,那就不好了,所以我们再试一次。但是,否则,我们发现了非负数n,所以我们只返回它。

这是递归函数的非常基本的示例。递归函数始终具有:

  • 在其自己的定义内对函数本身的调用。在这里,它位于测试的then子句中。
  • 一个recursion termination,基本上是许多语言中的return语句,但是在OCaml中,您没有显式地编写return。这里是n语句中的else

没有自调用功能,该函数将不是递归的,并且如果没有递归终止,它将永远循环。因此,在尝试编写递归函数时,请始终考虑“什么情况下无需再次调用该函数”,并将其写为递归终止。然后考虑“什么时候需要再次调用函数以及使用哪个参数”,然后编写自调用。