函数调用OCaml中的顺序

时间:2016-02-22 08:06:37

标签: ocaml

我发现OCaml中的跟踪功能跟随函数调用。我用斐波纳契尝试了它,但是函数调用的顺序并不是我期待的那个。在我的代码中,我首先调用fib (n - 1),然后调用fib (n - 2),但是,通过跟踪,它告诉我fib (n - 2)实际上是先调用的。是什么原因?

let rec fib n = 
    if n < 2 then 1
    else fib (n - 1) + fib (n - 2);;

当我跟踪fib 3时,我得到:

fib <-- 3
fib <-- 1
fib --> 1
fib <-- 2
fib <-- 0
fib --> 1
fib <-- 1
fib --> 1
fib --> 2
fib --> 3
- : int = 3

1 个答案:

答案 0 :(得分:5)

您的功能包含:fib (n - 1) + fib (n - 2)

未指定评估+的操作数的顺序。字节码OCaml编译器和本机OCaml编译器甚至可以使用不同的命令。无论出于何种原因,您使用的编译器只是选择生成首先评估fib (n - 2)的代码,然后是fib (n - 1),然后计算总和。