javascript実験4
javascript練習
とりあえず、準備運動の代わりにフィボナッチ数列。
function fib(n, r){ r=[0,1] if (r[n]==undefined) return fib(n-2, r) + fib(n-1, r) else return r[n] } print(fib(10)) //=>55 function fib_arr(n){ result=[]; for (var i =0; i < n; i++){ result.push(fib(i)) } return result } print(fib_arr(20)) //=>0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181
上の失敗(配列が記憶されてない)
function fib(n){ r=[0,1] return (function (n,r){ if (r[n]==undefined) return (r[n]=arguments.callee(n-2, r) + arguments.callee(n-1, r)) else return r[n] } )(n,[0,1]) }
さらに、
function fib(n) { if (n<=0) return 0 function f(x, y, z, n, a, b, c){ if (n<=0) return a if (n%2==0){ return f((x*x+y*y), (x*y+y*z), (y*y+z*z), (n/2), a, b, c) } else { return f(x,y,z, (n-1), (a*x+b*y), (b*y+c*y), (b*y+c*z)) } } return f(1,1,0,n-2,1,1,0) }
準備運動じゃなくなってしまった。
しかも最後のは、適切ではない値も返す。(使えない。)
r=[]; for(var i=0; i <= 20; i++){ r[i] = fib(i)}; print(r) 出力結果 //=>0,1,1,2,3,5,8,13,18,31,55,89,123,212,335,568,738,1306,2584,4181,5778 //=>0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765 //下が正解
どこかおかしい。疲れた(後で考える)
追記
fに渡す引数 (b*y+c*y) -> (b*x+c*y)
最後のfibでfib(100)の時、f()が呼ばれる回数10回。
再帰しすぎると「InternalError: too much recursion」というエラーがでる。防ぐ方法はないのかな?
memo
配列の要素を消すときは、「delete」。「delete」を使うと歯抜けになる。(だから、長さかわらない。)