为什么我的do / while循环有时无法运行?

时间:2018-12-28 18:41:52

标签: javascript jquery while-loop do-while

我有一个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/

3 个答案:

答案 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。

在尝试模数之前,您需要考虑零。