DEV Community

Vee Satayamas
Vee Satayamas

Posted on

ลองเขียน Tail call optimization ใน Erlang

5 มีนาคม 2562

จริง ๆ จะเขียนให้มันง่าย ๆ กว่านี้ก็ได้ เช่น ส่ง 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).
Enter fullscreen mode Exit fullscreen mode

ผมลองใส่ N ไป 100,000,000 มันก็ไม่ stack overflow นะครับ แต่ก็ไม่รู้ว่าผลถูกหรือเปล่า 😅

Top comments (0)