Почему мой цикл do / while иногда не запускается? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть цикл 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/

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Вы заменяете gcd как функцию на целое число.Если случится, что gcd вернет 1 в первый раз, когда ваш цикл завершится, но в любом другом сценарии он сломается.

Попробуйте переименовать функцию findGcd и объявите отдельную переменную gcd для хранения числа, чтобы не перезаписывать функцию.

0 голосов
/ 28 декабря 2018

Ваш цикл do / while работает.

Однако ваша функция gcd не всегда возвращает числовое значение.Из-за своей рекурсивной природы, a% b иногда оценивается как% 0, что возвращает NaN.

Вы должны учесть нули перед попыткой модуля.

0 голосов
/ 28 декабря 2018

Имя 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>
...