我发现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
答案 0 :(得分:5)
您的功能包含:fib (n - 1) + fib (n - 2)
未指定评估+
的操作数的顺序。字节码OCaml编译器和本机OCaml编译器甚至可以使用不同的命令。无论出于何种原因,您使用的编译器只是选择生成首先评估fib (n - 2)
的代码,然后是fib (n - 1)
,然后计算总和。