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)
,然后计算总和的代码。
我发现了 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)
,然后计算总和的代码。