递归函数-平方根计算-递归过多

时间:2019-05-27 18:18:59

标签: javascript recursion square-root

我正在尝试编写一个函数,该函数提供的结果类似于JavaScript内置math.sqrt函数。我使用的是函数反复猜测的反复试验方法,然后根据用户输入到程序中的数字的平方根细化猜测,直到成功达到正确的值为止。

当前,带有if .. else语句的递归函数用于执行计算,并调整猜测值,直到平方时达到用户定义的目标编号。

此函数可为11、22、33、44、55(平方根不是小数的任何数字)提供正确的答案。但是,它返回错误-与其他数字(例如13)进行过多的递归,尽管程序非常接近于解决问题-通常仅比目标数字高或低.00000000000000x。

此函数经历了多次迭代,最终我决定使用两个数组存储以前的猜测,根据它们的大小决定是否分类,然后将每个数组的最新猜测存储在一个数组中。可用于计算下一个猜测的变量。

先前的迭代要早得多地实现过多递归的错误,并且只会返回在函数第一次运行中到达正确答案的数字的正确结果,否则我的浏览器将崩溃。

// HTML

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Function library example</title>
  <style>
    input {
      font-size: 2em;
      margin: 10px 1px 0;
    }
  </style>
</head>
<body>

  <input class="numberInput" type="text">
  <p></p>

// JavaScript

  <script>
      var input = document.querySelector('.numberInput');
      var para = document.querySelector('p');

  function findSquareRoot(num){
    function find(guess, square, lastSmallGuess, lastLargeGuess){
      var smallerArray = [];
      var greaterArray = [];

      if(square == num){
        return guess;
      } else if(square > num){
          greaterArray.push(guess);
          console.log('Last Small Guess : ' + lastSmallGuess); // shows guess in developer tools
          console.log(' Last Large Guess : ' + lastLargeGuess); // shows guess in developer tools
          console.log((((guess * 1) + (lastSmallGuess * 1)) / 2), (((guess * 1) + (lastSmallGuess * 1)) / 2) * (((guess * 1) + (lastSmallGuess * 1)) / 2), lastSmallGuess, greaterArray[greaterArray.length-1]); // shows calculation process in dev tools
          return find((((guess * 1) + (lastSmallGuess * 1)) / 2), (((guess * 1) + (lastSmallGuess * 1)) / 2) * (((guess * 1) + (lastSmallGuess * 1)) / 2), lastSmallGuess, greaterArray[greaterArray.length-1]);
      } else if(square < num){
          smallerArray.push(guess);
          console.log('Last Small Guess : ' + lastSmallGuess);  // shows guess in developer tools
          console.log(' Last Large Guess : ' + lastLargeGuess); // shows guess in developer tools
          console.log((((guess * 1) + (lastLargeGuess * 1)) / 2), (((guess * 1) + (lastLargeGuess * 1)) / 2) * (((guess * 1) + (lastLargeGuess * 1)) / 2), smallerArray[smallerArray.length-1], lastLargeGuess); // shows calculation process in dev tools
          return find((((guess * 1) + (lastLargeGuess * 1)) / 2), (((guess * 1) + (lastLargeGuess * 1)) / 2) * (((guess * 1) + (lastLargeGuess * 1)) / 2), smallerArray[smallerArray.length-1], lastLargeGuess);
    } 
  }
  return find((num * 1) / 2, ((num * 1) / 2) * ((num * 1) / 2), 0, 0);
}

  input.onchange = function() {
    var num = input.value;
    if(isNaN(num)) {
      para.textContent = 'You need to enter a number!';
    } else {
      para.textContent = num + ' square root is ' + findSquareRoot(num) + '. ' +
                       num + ' square root is ' + Math.sqrt(num) + '.';
    }
  }
  </script>
</body>
</html>

我希望我的函数能够始终如一地提供与内置math.sqrt函数相同的答案。尽管即使该函数导致浏览器崩溃,因此也没有返回结果,但是它已经达到了非常接近正确答案的答案,如开发人员工具的控制台部分所示。使用其他数字,它返回的结果与math.sqrt完全相同

感谢您抽出宝贵时间阅读我的问题。

0 个答案:

没有答案