我有一个do / while循环,该循环生成2到10之间的两个数字,然后检查它们的最大公因数。如果最大公因数不等于1,它将生成两个不同的数字,直到找到两个除1以外没有其他公因数的数字。
大多数时间都在运行,但是大约每四次运行一次,就无法生成数字。该代码似乎被“卡住了”,但是我不确定为什么:
JAVASCRIPT
For N = 1e2, takes ~0.00 sec
For N = 1e3, takes ~0.15 sec
For N = 1e4, takes ~15.1 sec
For N = 1e5, takes too long, didn't wait to finish
HTML
seq
JSFiddle:http://jsfiddle.net/190mvbzt/
答案 0 :(得分:2)
您正在将gcd作为函数替换为整数。如果gcd在第一次退出循环时碰巧返回1,但在任何其他情况下它将中断。
尝试重命名函数findGcd并声明一个 separate gcd变量以保存该数字,以免覆盖该函数。
答案 1 :(得分:1)
该功能已使用gcd
名称,因此,如果为其分配值,则基本上用新值覆盖该功能。
为此变量使用另一个名称,例如gcdResult
:
var gcdResult = gcd(Numerator, Denominator);
并相应地调整您的while
:
while (gcdResult != 1);
它变成:
function randomBetween(min, max) {
var ceiling = max + 1;
return Math.floor(Math.random() * (ceiling - min)) + min;
}
function GenerateRandomNumberNoCommonFactorsWithAnother() {
var Numerator;
var Denominator;
var gcdResult;
var gcd = function gcd(a, b) {
return b ? gcd(b, a % b) : a;
};
do {
Numerator = randomBetween(2, 10);
Denominator = randomBetween(2, 10);
gcdResult = gcd(Numerator, Denominator);
} while (gcdResult != 1);
return {
Numerator: Numerator,
Denominator: Denominator,
}
}
var Test = GenerateRandomNumberNoCommonFactorsWithAnother();
$(".Test").html(Test.Numerator);
$(".Test2").html(Test.Denominator);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span class="Test"></span>
<br>
<span class="Test2"></span>
答案 2 :(得分:0)
您的do / while循环有效。
但是,您的gcd函数并不总是返回数字值。由于其递归性质,有时会将a%b评估为a%0,这将返回NaN。
在尝试模数之前,您需要考虑零。