我想创建一个将两个整数相加的程序。但是,它们都必须是积极的。 我想写这样的东西:
let n = read_int ()
while n<=0 do
let n = read_int ()
done
因此它将再次读取该数字,直到检查它是否为正。
正确的方法是什么?
答案 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
。 没有自调用功能,该函数将不是递归的,并且如果没有递归终止,它将永远循环。因此,在尝试编写递归函数时,请始终考虑“什么情况下无需再次调用该函数”,并将其写为递归终止。然后考虑“什么时候需要再次调用函数以及使用哪个参数”,然后编写自调用。