我遇到了一个问题,它给了我超出最大调用堆栈大小。在这一点上,这确实令人困惑,因为我确实有一个基本案例。
<body>
<input type="text" id="Input">
<script language='javascript'>
var input = document.getElementById("Input").value;
var n = parseInt(input);
function fib(n){
if(n <= 1)
{
return 1;
}
else
{
return fib(n-2) + fib(n-1);
}
}
</script>
<button onclick= "fib(n)">aButton </button>
</body>
答案 0 :(得分:1)
你的代码有一点缺陷,导致函数被无限调用。
作为一个基本案例,请尝试n < 2
,而不是测试n<=1
,如下所示:
function fib(n){
if(n <= 1)
{
return 1;
}
else
{
return fib(n-1) + fib(n-2);
}
}
否则它会继续调用fib()
而不会触发基本情况!
希望它有所帮助!
修改强>
好的!在您编辑代码后,我发现您在此处遇到了另一个重大错误...
var n = parseInt(document.getElementById("Input").value)
每次调用 fib()
时获取输入值。这意味着你永远不会允许调用基础案例!而是调用fib()
并且每次都将n初始化为原始值。
相反,尝试类似:
var n = parseInt(document.getElementById("Input").value);
function fib(n){
if(n <= 1)
{
return 1;
}
else
{
return fib(n-1) + fib(n-2);
}
}
document.write(fib(n));
编辑2
试试这个:
<script language='javascript'>
function runfib() {
var input = document.getElementById("Input").value;
var n = parseInt(input);
document.getElementById("demo").innerHTML = fib(n);
}
function fib(n){
if(n <= 1)
{
return 1;
}
else
{
return fib(n-2) + fib(n-1);
}
}
</script>
<body>
<input type="text" id="Input">
<button onclick= "runfib()">Get My Fib #!</button>
<p id="demo"></p>
</body>
它使用名为runfib()
的辅助函数。您试图在没有任何参数的情况下调用fib()
,以及其他错误。
此代码已经过测试并且有效。 (这是一个Fiddle)
答案 1 :(得分:0)
尝试记忆你的纤维:
var fib = (function(){
var memo = [0,1];
return function fib(n) {
var result = memo[n];
if (typeof result === 'number') {
return result;
} else {
memo[n] = fib(n-1) + fib(n-2);
result = memo[n];
}
return result;
}
})();
它会以指数方式减少计算次数。我跑了fib(400)并且工作正常。