Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的代码不能计算Fibonnaci 30及以上_Javascript - Fatal编程技术网

Javascript 为什么我的代码不能计算Fibonnaci 30及以上

Javascript 为什么我的代码不能计算Fibonnaci 30及以上,javascript,Javascript,我正在运行这个,但是Fibonnaci 30以上的数字继续加载 这是我的密码: <script type="text/javascript"> function fib(n) { if (n <= 1) { return 1; } else { return (fib(n - 1) + fib(n - 2) + fib(n - 3)); } } function start() { document.getEl

我正在运行这个,但是Fibonnaci 30以上的数字继续加载

这是我的密码:

<script type="text/javascript">
function fib(n) {

    if (n <= 1) {
        return 1;
    } else {
        return (fib(n - 1) + fib(n - 2) + fib(n - 3));
    }
}

function start() {
    document.getElementById("result").innerHTML = fib(30)
}

window.addEventListener("load", start, false)
</script>

函数fib(n){

如果(n这里的问题是,当您增加传入的初始数量时,它在内部以指数形式调用自己

当你调用
fib(3)
时,比如说,它会在内部再次调用
fib
6次。如果你调用
fib(4)
,它会在内部调用自己12次。
fib(5)
会使其调用25次。每次调用都会以指数形式增加

当你到达30时,它会调用自己的104551006次(),这需要一段时间,更大的数字只会让情况变得更糟

这是另一个递归fibonnacci计算器,改编自:


可靠的实现始终是最佳途径,因此您应该使用James Thorpe的实现。但是,减少对递归函数调用的另一种方法是记忆化。本质上,记忆化缓存对具有特定参数集的函数调用的结果

原始代码(修改为返回实际的Fibonnaci序列):

var call\u count=0;
函数fib(n){
调用_count++;

如果(n)用调试器逐步执行它。很可能你遇到了一些递归。Fib(n)是Fib(n-1)+Fib(n-2);添加Fib(n-3)将给出错误的答案。@JamesThorpe。应该是什么样的。老实说,我对它知之甚少javascript@JamesThorpe是的,它给出了JO-John序列:)我不知道这是什么意思,我打字太快了。发生的事情是,当你调用
fib(3)
时,它会在内部再次调用
fib
6次。如果你调用
fib(4)
,它会在内部调用自己12次。
fib(5)
将使其增加25倍。每增加一倍,它将以指数形式增加。到30倍时,它将调用自己的104551006次(),这需要一段时间。更大的数字只会使情况更糟。
function fib(term, val, prev)
{
    if (!val)
        val = 1;
    if (!prev)
        prev = 0;

    if(term == 0) return prev;
    if(term == 1) return val;
    return fib(term - 1, val+prev, val);
}

alert(fib(6)); //gives 8, the 6th number in the sequence