OCaml 中的函数调用顺序

functions calls order in OCaml

我发现了 OCaml 中跟踪函数调用的跟踪函数。我用 fibonacci 试了一下,但是函数调用的顺序不是我所期望的。在我的代码中,我先调用 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

您的函数包含:fib (n - 1) + fib (n - 2)

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