首页 > 解决方案 > 在while循环中检查数字的因子时获得无限循环

问题描述

我正在努力infinite loop解决需要使用 Java Script 功能方式完成的数组练习实现的问题:我有一个代码,它创建一个数组并用满足条件的数字填充它的值:

Each array element has a value,
which we draw from the range <100, 200> until the sum of digits is
a number having exactly two dividers, not counting 1 and this one
numbers.

我有如下代码:

const generateNumber = (min, max) =>
    Math.floor(Math.random() * (max - min + 1)) + Math.floor(min);

const unities = number => number % 10;
const hundreds = number => Math.floor((number % 1000) / 100);
const tens = number => Math.floor((number % 100) / 10);

const sumDigits = (number) => unities(number) + hundreds(number) + tens(number);

const countNumberFactors = number => Array
.from(Array(number + 1), (_, i) => i)
.filter(i => number % i === 0)
.slice(1, -1)
    .length;

const generateNumberUntilConditionNotAchieve = (min, max) => {
  let number = generateNumber(min, max);
  const digitsSum = sumDigits(number);
  while (countNumberFactors(digitsSum) === 2) {
    number = generateNumber(min, max)
  }
  return number;
}

const generateArray = (minArrSize, maxArrSize, minItemValue, maxItemValue) =>
    Array(generateNumber(minArrSize, maxArrSize))
    .fill(0)
    .map(
        () => generateNumberUntilConditionNotAchieve(minItemValue,
            maxItemValue));

const main = () => {
  const generatedArray = generateArray(1, 5, 100, 200);
  console.log("Array -> " + generatedArray);
}

main();

对于较小minArraySizemaxArraySize值,有时我会收到理想的结果,但对于像 <10, 100> 这样的参数,我的 IDE 会冻结。在粘贴了上述代码的在线编辑器上,我在线收到有关无限循环的信息:

while (countNumberFactors(digitsSum) === 2)

我试图通过反复试验来调查根本原因,但我没有找到解决方案。infinite loop对于如何解决上述问题的建议,我将不胜感激。

标签: javascript

解决方案


您正在更改number但正在检查digitsSum. 解决此问题所需要做的就是digitsSum = sumDigits(number)在 while 循环中添加。例如

const generateNumberUntilConditionNotAchieve = (min, max) => {
  let number = generateNumber(min, max);
  const digitsSum = sumDigits(number);
  while (countNumberFactors(digitsSum) === 2) {
    number = generateNumber(min, max);
    digitsSum = sumDigits(number);
  }
  return number;
}

推荐阅读