【问题标题】:Test whether all array elements are factors of a number - return inside a for loop测试所有数组元素是否都是数字的因数 - 在 for 循环内返回
【发布时间】:2019-04-06 13:04:54
【问题描述】:

我有以下问题:

编写一个函数,如果数组中的所有整数都是数字的因数,则返回 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 语句不能去那里。

【问题讨论】:

  • 您应该将return true 退出循环;) 并将return false 留在循环内:) 这样做的原因是,否则您的循环在第一次检查后真的停止,返回要么true 或 false,并且您希望它在某些不是因素时立即返回 false。循环外的 return true 将表明所有提供的数字都包含在 number 参数的因数
  • 仅供参考,不只是你,这是人们刚开始编程和循环时最常犯的错误之一。 :-)
  • @t.j.crowder 但我们没有一个好的欺骗目标。
  • @JonasWilms - 是的,我给这个加了书签是因为没有很多无关的东西,它真的只是更早的回报。 :-)
  • @T.J.Crowder stackoverflow.com/questions/42913798/… 是我为这类问题写的一般骗子。

标签: javascript arrays loops if-statement


【解决方案1】:

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

检查所有的巧克力,为每一种巧克力品尝,如果没问题,告诉我一切都很好,否则告诉我有问题¹

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

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

检查巧克力,每一种巧克力,尝一尝,如果味道不好,立即告诉我,否则继续,直到你都尝过,然后回到我身边告诉我一切都很好。²

或者在代码中:

 // ¹
  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");
 }

isTasty 是一个接受巧克力并返回真或假的函数。


如果您还没有掌握它,那就试试吧!买些巧克力,尝尝吧!如果有人告诉您“吃巧克力不是在学习”,请回复“我在做rubber duck debugging”,没有人可以抱怨:)

【讨论】:

  • 一个小问题——它是“巧克力”,而不是“巧克力”。
【解决方案2】:

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

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

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

  • 在数组1 中的第一个元素上,它将检查条件num % element !== 0 是否为假,因此它会从函数转到else 条件和return true,并且不会检查其余值。
  • 所以你需要在最后保留return true,这样如果循环中的任何值不满足if条件,那么只有控制将转到return 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. failing case 返回值保留在 for 循环中
  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));

【讨论】:

    【解决方案3】:

    在循环内部,输入 num 进行了可分割性测试,如果 num 可分割,则控件将进入函数返回 trueelse 块。

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

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

    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));

    【讨论】:

      【解决方案4】:

      是的,“其他”导致了问题。我将其删除并在 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;
      }
      

      【讨论】:

      • 他也在寻找解释
      • 我看到 Icepickle 在问题 cmets 中很好地解释了! Jonas Wilms 的回答也是如此。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:
        const checkFactors = (factors, num) => factors.reduce((acc, x)=>acc && num%x===0);
        

        const checkFactors = (factors, num) => factors.every(x => num%x===0);
        

        【讨论】:

          【解决方案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);
          
                          }
                      }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-08
            相关资源
            最近更新 更多