Javascript 为什么我的代码不能计算Fibonnaci 30及以上
我正在运行这个,但是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
<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