我正在尝试编写一个函数,该函数提供的结果类似于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完全相同
感谢您抽出宝贵时间阅读我的问题。