Javascript:最大调用堆栈大小超出错误

时间:2017-07-10 01:27:12

标签: javascript html

我遇到了一个问题,它给了我超出最大调用堆栈大小。在这一点上,这确实令人困惑,因为我确实有一个基本案例。

<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>

2 个答案:

答案 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)并且工作正常。