【问题标题】:Why does my do/while loop occasionally fail to run?为什么我的 do/while 循环偶尔无法运行?
【发布时间】:2019-05-26 13:00:06
【问题描述】:

我有一个 do/while 循环,它生成 2 到 10 之间的两个数字,然后检查它们的最大公因数。如果最大公因数不等于 1,则生成两个不同的数,直到找到两个除 1 之外没有任何公因数的数。

这大部分时间都会运行,但大约每四次,它就无法生成数字。代码似乎“卡住”了,但我不知道为什么:

JAVASCRIPT

function randomBetween(min, max) {
  var ceiling = max + 1;
  return Math.floor(Math.random() * (ceiling - min)) + min;
}

function GenerateRandomNumberNoCommonFactorsWithAnother() {
  var Numerator;
  var Denominator;
  var gcd = function gcd(a, b) {
    return b ? gcd(b, a % b) : a;
  };
  do {
    Numerator = randomBetween(2, 10);
    Denominator = randomBetween(2, 10);
    gcd = gcd(Numerator, Denominator);
  } while (gcd != 1);
  return {
    Numerator: Numerator,
    Denominator: Denominator,
  }
}

var Test = GenerateRandomNumberNoCommonFactorsWithAnother();
$(".Test").html(Test.Numerator);
$(".Test2").html(Test.Denominator);

HTML

<span class="Test"></span>
<br>
<span class="Test2"></span>

JSFiddle:http://jsfiddle.net/190mvbzt/

【问题讨论】:

    标签: javascript jquery while-loop do-while


    【解决方案1】:

    您将 gcd 作为一个整数替换为函数。如果 gcd 在您的循环第一次退出时碰巧返回 1 但在任何其他情况下它将中断。

    尝试重命名函数 findGcd 并声明一个 单独的 gcd 变量来保存数字,这样您就不会覆盖该函数。

    【讨论】:

    • 有道理。谢谢你,克里斯托弗!
    【解决方案2】:

    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>

    【讨论】:

    • 有道理 - 谢谢你的帮助!如果允许,我会在几分钟内“接受”答案
    【解决方案3】:

    您的 do/while 循环有效。

    但是,您的 gcd 函数并不总是返回数值。由于它的递归性质,a % b 有时被评估为 a%0,它返回 NaN。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2022-12-12
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多