Scalaでフィボナッチ

まずは、フィボナッチ数列の定義どおりに書いてみました。

    // Fibonacci数(フィボナッチ数)fib(10)=>55, fib(20)=>6765
    def fib(n:Int):Int = {
        if (n==0) 0
        else if (n==1) 1
        else fib(n-1)+fib(n-2)
    }

補助関数を作って末尾再帰にしてみました。

    def fib2(n:Int):Int = {
        // a:1つ前の数、b:2つ前の数。count:計算回数。
        def fibIter(a:Int, b:Int, count:Int):Int = {
            if (count==0)
                b
            else
                fibIter(a+b, a, count-1)
        }
        fibIter(1, 0, n)
    }

関数の中に関数が書けるなんて、pascal以来です。なつかしいー。
あっ、でもlispschemeでも書けますね。