nac*_*hos 1 ocaml if-statement
let cond (a,b,c) =
match a with
| true -> b
| false -> c
let rec fact n =
cond (n=0,1, n * fact (n-1))
let rec fact n =
if n=0 then 1 else n * fact (n-1)
Run Code Online (Sandbox Code Playgroud)
在上面的代码段中,第一个版本给出了堆栈溢出异常,而第二个版本正常工作.这两者有什么区别?他们似乎功能相同,但显然没有.
OCaml是严格的,即cond在cond调用时计算函数的所有参数.这包括调用fact(n-1)when n为零,即您将评估fact(-1)等等.因此,您有一个未终止的递归,因此堆栈溢出.
if-then-else语句的第二个示例仅评估其中一个案例,这样递归是有限的.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |