CoffeeScriptでフィボナッチ数をえるやつ

電車の中で暇だったからCS at onceで書いた。フィボナッチ数列を得るやつ。
一番素朴な書き方なのですごく時間かかる。
早くするには一度求めた値を保存したり、引数を三つ取る形にしたりするといいらしい。
同じ数を何度も求めてるから無駄だということがわかってよかった。

  # フィボナッチ数を得る
  fib = (n) ->
    return  0 if n is 0
    return  1 if n is 1
    # 再起的に呼び出す
    return (fib n - 1) + (fib n - 2)

  # フィボナッチ数列を得る
  getFibAry = (n) ->
    fibAry = []
    i = 0
    while i < n
      fibAry.push fib i
      i++
    return fibAry.join ","

追記(2013/06/21)

クロージャにして一度求めた数を保存するようにした。
速いっぽい。

  # フィボナッチ数を得る
  fib = (->
    # 初期条件
    fibAry = [0,1]
    (n) ->
      return fibAry[n] if fibAry[n]?
      ret = (fib n - 1) + (fib n - 2) 
      # 求めた値を保存する
      fibAry[n] = ret
      return ret
  )()


見よう見まねでクラスっぽく書いた。

  class Fibonacci
  
    # 初期条件
    fibAry : [0,1]
    
    # フィボナッチ数を返す
    getFib : (n) =>
      return @fibAry[n] if @fibAry[n]?
      ret = (@getFib n - 1) + (@getFib n - 2) 
      @fibAry[n] = ret
      return ret
  
    # フィボナッチ数列を文字列として返す
    getFibStr : (n, separator = ",") =>
      @getFib n
      ary = @fibAry.slice 0, n + 1
      return ary.join separator
  
    # フィボナッチ数列を返す
    getFibAry : (n) =>
      @getFib n
      # 配列のコピーを返す
      ary = @fibAry.slice 0, n + 1
      return ary