提问人:PineNuts0 提问时间:4/6/2019 最后编辑:Jonas WilmsPineNuts0 更新时间:9/2/2021 访问量:4443
测试是否所有数组元素都是数字的因数 - 返回 for 循环
Test whether all array elements are factors of a number - return inside a for loop
问:
我有以下问题:
编写一个函数,如果数组中的所有整数都是数字的因数,则返回 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 置于 for 循环之外,
如果您保留任何不满足您的代码的值,在这种情况下不应该发生这种情况,因为您正在检查数组中的所有值应该是给定数字的因数return true
else part
num % element !== 0
return true
让我们通过第一个例子来理解
- 在数组中的第一个元素上,它将检查条件是否为 false,因此它将转到 else 条件和 from 函数,并且不会检查其余值。
1
num % element !== 0
return true
- 因此,您需要保留在最后,因此,如果循环中的任何值不满足 if 条件,则只有控制将转到
return true
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))
简而言之 - 在这种情况下,如果您希望所有这些条件都必须与经验法则匹配,您可以将其视为
- 将返回值保留在 for 循环中
failing case
- 将返回值保留在函数结束时
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));
是的,“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;
}
评论
你在一家巧克力店工作,你的老板告诉你检查所有的巧克力(有辣椒巧克力、焦糖巧克力和咖啡巧克力)是否都很好吃。他告诉你以下几点:
遍历所有的巧克力,对于每块巧克力,品尝它,如果它没问题,告诉我一切都很好,否则告诉我有问题¹
你从第一块巧克力开始,这是辣椒巧克力,味道很美味,你去找你的老板,告诉他一切都很好。你的老板对你大吼大叫,因为你还没有尝过焦糖巧克力和咖啡巧克力。
你意识到你的老板实际上希望你做:
把巧克力,每一块巧克力都尝一尝,如果味道不好,就告诉我,否则继续,直到你全部尝完,然后回到我身边,告诉我一切都很好。²
或者在代码中:
// ¹
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
如果你还没有掌握它,那就试试吧!买一些巧克力,尝尝!如果有人告诉你“吃巧克力不是学习”,回答“我在做橡皮鸭调试”,没有人可以抱怨:)
评论
在循环内部,对输入进行了可整除性测试,如果 是可整除的,则控件将进入函数返回的块中。num
num
else
true
当第一个数字可整除时,循环没有检查它返回的输入数组的所有数字。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));
代码的逻辑是错误的。您应该检查数组的所有元素,如果所有元素都满足条件,则返回 true,但如果其中一个元素不满足条件,则立即返回 false。else 表示一个项目满足条件,但不是所有元素。这就是问题所在。
const checkFactors = (factors, num) => factors.reduce((acc, x)=>acc && num%x===0);
或
const checkFactors = (factors, num) => factors.every(x => num%x===0);
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);
}
}
评论
return true
return false