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」を使うと歯抜けになる。(だから、長さかわらない。)