ลองเขียน 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 นะครับ แต่ก็ไม่รู้ว่าผลถูกหรือเปล่า 😅