ลองเขียน Tail call optimization ใน Erlang
จริง ๆ จะเขียนให้มันง่าย ๆ กว่านี้ก็ได้ เช่น ส่ง N ไปใน argument เลย แต่มันจะง่ายไป อยากจะดูว่าถ้าใช้ fun แล้วมันจะเรียกตัวเองได้ไหม ปกติก็คือไม่ได้ แต่ก็มีท่าแก้คือส่ง Fib เข้าไปเป็น F แล้วใน Fib เรียก F อีกที
(แก้ code วันที่ 18 มี.ค. 2556)
-module(rec3).
-export([fib/1]).
fib(N) ->
Fib = fun (F, I, Acc1, Acc2) when I < N ->
F(F, I + 1, Acc2, Acc1 + Acc2);
(_, _, _, Acc2) ->
Acc2
end,
Fib(Fib, 0, 0, 1).
ผมลองใส่ N ไป 100,000,000 มันก็ไม่ stack overflow นะครับ แต่ก็ไม่รู้ว่าผลถูกหรือเปล่า 😅