测试是否所有数组元素都是数字的因数 - 返回 for 循环

Test whether all array elements are factors of a number - return inside a for loop

提问人:PineNuts0 提问时间:4/6/2019 最后编辑:Jonas WilmsPineNuts0 更新时间:9/2/2021 访问量:4443

问:

我有以下问题:

编写一个函数,如果数组中的所有整数都是数字的因数,则返回 true,否则返回 false。

我尝试了下面的代码:

function checkFactors(factors, num) {

  for (let i=0; i<factors.length; i++){
    let element = factors[i];
      console.log(element)

    if (num % element !== 0){
      return false 
    }
    else {
      return true
    }
  }
}

console.log(checkFactors([1, 2, 3, 8], 12)) //➞ false

我的解决方案返回 true,这是错误的。我知道是 else 语句搞砸了。但我想理解为什么 else 语句不能去那里。

JavaScript 数组循环 if-statement

评论

2赞 Icepickle 4/6/2019
你应该得到一个出环;)并留下内部循环:)这样做的原因是,否则你的循环在第一次检查后就会停止,要么返回 true 要么 false,你希望它一旦某些东西不是一个因素就返回 false。然后,循环外部的返回 true 将指示所有数字都提供 where number 参数的因子return truereturn false
2赞 T.J. Crowder 4/6/2019
仅供参考,这不仅仅是您,这是人们在刚开始编程和循环时最常犯的错误之一。:-)
1赞 Jonas Wilms 4/6/2019
@t.j.crowder,但我们没有一个好的欺骗目标。
2赞 T.J. Crowder 4/6/2019
@JonasWilms - 是的,我把这个收藏起来,因为没有很多无关紧要的东西,它真的只是早期的回归。:-)
0赞 Barmar 4/7/2019
@T.J.克劳德 stackoverflow.com/questions/42913798/......是我为这类问题写的一般骗局。

答:

5赞 Code Maniac 4/6/2019 #1

只需将 return true 置于 for 循环之外,

如果您保留任何不满足您的代码的值,在这种情况下不应该发生这种情况,因为您正在检查数组中的所有值应该是给定数字的因数return trueelse partnum % element !== 0return true

让我们通过第一个例子来理解

  • 在数组中的第一个元素上,它将检查条件是否为 false,因此它将转到 else 条件和 from 函数,并且不会检查其余值。1num % element !== 0return true
  • 因此,您需要保留在最后,因此,如果循环中的任何值不满足 if 条件,则只有控制将转到return truereturn true

function checkFactors(factors, num) {

  for (let i=0; i<factors.length; i++){
    let element = factors[i];
    if (num % element !== 0){
      return false 
    }
  }
  return true
}



console.log(checkFactors([1, 2, 3, 8], 12)) //➞ false
console.log(checkFactors([1, 2], 2))

简而言之 - 在这种情况下,如果您希望所有这些条件都必须与经验法则匹配,您可以将其视为

  1. 将返回值保留在 for 循环中failing case
  2. 将返回值保留在函数结束时passing case

对于这种情况,JS 有一个内置的 Array.every 方法

function checkFactors(factors, num) {
   return factors.every(element => num % element === 0);
}
console.log(checkFactors([1, 2, 3, 8], 12)); 
console.log(checkFactors([1, 2], 2));

0赞 javapedia.net 4/6/2019 #2

是的,“else”导致了问题。我删除了它并在 for 循环之外添加了“return true”。

function checkFactors(factors, num) {

  for (let i=0; i<factors.length; i++){
    let element = factors[i];
      console.log(element)

    if (num % element !== 0){
      return false 
    }
  }
  return true;
}

评论

1赞 Icepickle 4/6/2019
不过,他也在寻找一个解释
0赞 javapedia.net 4/6/2019
我看到 Icepickle 在问题评论中解释得很好!乔纳斯·威尔姆斯(Jonas Wilms)也是。
7赞 Jonas Wilms 4/6/2019 #3

你在一家巧克力店工作,你的老板告诉你检查所有的巧克力(有辣椒巧克力、焦糖巧克力和咖啡巧克力)是否都很好吃。他告诉你以下几点:

遍历所有的巧克力,对于每块巧克力,品尝它,如果它没问题,告诉我一切都很好,否则告诉我有问题¹

你从第一块巧克力开始,这是辣椒巧克力,味道很美味,你去找你的老板,告诉他一切都很好。你的老板对你大吼大叫,因为你还没有尝过焦糖巧克力和咖啡巧克力

你意识到你的老板实际上希望你做:

把巧克力,每一块巧克力都尝一尝,如果味道不好,就告诉我,否则继续,直到你全部尝完,然后回到我身边,告诉我一切都很好。²

或者在代码中:

 // ¹
  function checkChocolates(chocolates) {
    for(const chocolate of chocolates) {
       if(isTasty(chocolate)) {
         return true;
       } else {
         return false;
       }
    }
 }

 // ²
 function checkChocolates(chocolates) {
   for(const chocolate of chocolates) {
     if(isTasty(chocolate)) {
       continue; // this could be omitted, as a loop keeps looping nevertheless
     } else {
       return false;
     }
   }
   return true;
 }

由于这是编程中非常常见的任务,因此已经有一种更短的方法来表达这一点:

 if(chocolates.every(isTasty)) {
   alert("all chocolates are fine");
 } else {
    alert("Oh, that doesnt taste good");
 }

而 是一个函数,它接受巧克力并返回 true 或 false。isTasty


如果你还没有掌握它,那就试试吧!买一些巧克力,尝尝!如果有人告诉你“吃巧克力不是学习”,回答“我在做橡皮鸭调试”,没有人可以抱怨:)

评论

1赞 Wai Ha Lee 4/6/2019
一个小小的狡辩——它是“巧克力”,而不是“巧克力”。
1赞 Fullstack Guy 4/6/2019 #4

在循环内部,对输入进行了可整除性测试,如果 是可整除的,则控件将进入函数返回的块中。numnumelsetrue

第一个数字可整除时,循环没有检查它返回的输入数组的所有数字。true

只需使用一个标志变量来查看是否所有元素都可被输入数字整除,如果任何一个元素不可整除,则将设置为,然后我们可以退出循环并返回它,因为没有必要检查其他数字。numflagfalsebreak

function checkFactors(factors, num) {
  let flag = true;
  for (let i=0; i<factors.length; i++){
    let element = factors[i];
    if (num % element !== 0){
      flag = false;
      break;
    }
  }
  return flag;
}

console.log(checkFactors([1, 2, 3, 8], 12)); 
console.log(checkFactors([1, 2], 2));
console.log(checkFactors([2, 4, 3, 6, 9], 12));
console.log(checkFactors([3, 5, 2, 6, 9], 15));
console.log(checkFactors([4, 2, 8, 1], 16));

您还可以使用 Array.every 以简洁的方式检查相同的内容:

function checkFactors(factors, num) {
   return factors.every(element => num % element === 0);
}
console.log(checkFactors([1, 2, 3, 8], 12)); 
console.log(checkFactors([1, 2], 2));
console.log(checkFactors([2, 4, 3, 6, 9], 12));
console.log(checkFactors([3, 5, 2, 6, 9], 15));
console.log(checkFactors([4, 2, 8, 1], 16));

0赞 W.Bright 4/6/2019 #5

代码的逻辑是错误的。您应该检查数组的所有元素,如果所有元素都满足条件,则返回 true,但如果其中一个元素不满足条件,则立即返回 false。else 表示一个项目满足条件,但不是所有元素。这就是问题所在。

0赞 ABD 2/21/2021 #6
const checkFactors = (factors, num) => factors.reduce((acc, x)=>acc && num%x===0);

const checkFactors = (factors, num) => factors.every(x => num%x===0);
0赞 Maninder 9/2/2021 #7
            package Map;
            import java.util.ArrayList;
            import java.util.Scanner;

            public class Question3 {
                public void factorize(int number) {
                    ArrayList<Integer> temp = new ArrayList<>();
                    for (int i = 1; i <= number; i++) {
                        if (number % i == 0) {
                            temp.add(i);
                        }
                    }
                }

                public static void main(String[] args) {
                    Scanner sc = new Scanner(System.in);
                    System.out.println("Enter the number do you want to check factorize: ");
                    int i = sc.nextInt();
                    Question3 question3 = new Question3();
                    question3.factorize(i);

                }
            }