我在OCaml中发现了trace函数来跟踪函数调用.我用斐波纳契尝试了它,但是函数调用的顺序并不是我期待的那个.在我的代码中,我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);;
Run Code Online (Sandbox Code Playgroud)
当我追踪时,fib 3我得到:
fib <-- 3
fib <-- 1
fib --> 1
fib <-- 2
fib <-- 0
fib --> 1
fib <-- 1
fib --> 1
fib --> 2
fib --> 3
- : int = 3
Run Code Online (Sandbox Code Playgroud)
你的功能包括: fib (n - 1) + fib (n - 2)
+未指定评估操作数的顺序.字节码OCaml编译器和本机OCaml编译器甚至可以使用不同的命令.无论出于何种原因,您使用的编译器只是选择生成fib (n - 2)先评估的代码fib (n - 1),然后计算总和.