[英]displaying even and odd numbers in an array
给定两个数字X和Y,编写一个函数:1.返回X和Y之间的偶数,如果X大于Y,否则返回x和y之间的奇数例如,取整数10和2。 该函数将返回2到10之间的所有偶数
我是JavaScript新手,这是到目前为止我尝试过的。
const number_game = (x, y) => {
// Code here
let numArray = [];
let numArray2 = []
if(x < y){
for (i=x+1; i<y; i++) {
if (i%2 != 0) {
numArray.push(i);
}else {
numArray2.push(i)
}
}
}
else{
if(x > y){
for (i=y+1; i<x; i++) {
if (i%2 != 0) {
numArray.push(i);
}else {
numArray2.push(i)
}
}
}
} return numArray
}
我在下面收到此错误
期望[ Array(9) ] to deeply equal [ Array(11) ]
首先在if语句中将变量x和y相互比较。 当x更大时,偶数的for循环从y到x。 如果发现该数字可被2整除,则将其放入数组中。 如果y> x,则奇数的for循环从x到y。 如果数字不能被2整除,则表示它是奇数,并将其压入数组。 打印阵列。
var x=2; var y=10; arr=[]; if(x>y) { for(let i=y;i<x;i++) { if(i%2==0) arr.push(i); } } else { for(let i=x;i<y;i++) { if(i%2==1) arr.push(i); } } console.log(arr)
告诉我是否有效。 我添加了解释
function number_game(x,y){
let resultArr = []; //The array which will be returned
//To return all even numbers x and y
if(x>y){
//checks if y(smaller number) and make it even
if(y % 2 != 0 ) y+=1
//Now y is even and by add 2 each loop it will get all even to result arr
for(let i = y;i<x;i+=2){
resultArr.push(i);
}
}
//To return all even odd x and y
else{
//checks if x(smaller number) and odd it even
if(x % 2 == 0 ) x+=1
//Now x is odd and by add 2 each loop it will get all odds to result arr
for(let i = x; i<y; i+=2){
resultArr.push(i);
}
}
return resultArr;
}
console.log(number_game(2,10)) //[3, 5, 7, 9]
console.log(number_game(10,2)) //[2, 4, 6, 8]
所以这里的想法是首先我们检查start
和end
。 如果start
小于end
,如果我们检查的条件比内start
它是否是与否如果连我们保持它,因为它是如果不是我们把它加1。 在while循环中,我们继续将start
推到最终输出,并将2加到start,直到小于end
。 否则我们检查奇数和休息过程是否相同。
function giveMeNumbers(start,end){ let op = [] if(start < end) { start = start % 2 ? start++ : start; while(start < end){ op.push(start); start+=2 } } else { end = end%2 ? end : end++; while(start > end){ op.push(end); end+=2 } } return op; } console.log(giveMeNumbers(1,11)) console.log(giveMeNumbers(22,10))
如果x> y,则返回所有偶数 ,否则,如果x <y,则返回所有奇数
const number_game = (x, y) => {
let range;
if (x > y) {
range = Array(x - y + 1).fill().map((_, idx) => y + idx)
return range.filter(num => !(num % 2))
} else{
range = Array(y - x + 1).fill().map((_, idx) => x + idx)
return range.filter(num => (num % 2))
}
}
console.log('x > y ', number_game(22,10)); // [ 10, 12, 14, 16, 18, 20, 22 ]
console.log('x < y ', number_game(2,10)); // [ 3, 5, 7, 9 ]
这是使用Generator
的解决方案:
function * generateNumbers (start, stop) { let x = start; while(x <= stop) { yield x; x = x + 1; } } function * filterGen (f, gen) { for (const x of gen) { if (f(x)) { yield x; } } } const isEven = x => x % 2 === 0; const isOdd = x => !isEven(x); const makeNum = (a, b) => { if (a <= b) { return [...filterGen(isEven, generateNumbers(a, b))]; } return [...filterGen(isOdd, generateNumbers(b, a))]; } console.log('Evens 1 through 10:', makeNum(1, 10)); console.log('Odds 1 through 10:', makeNum(10, 1));
generateNumbers
函数产生start
和stop
之间所有整数的序列。 例如:
generateNumbers(1, 3); // -> 1, 2, 3
然后将生成的生成器传递到filterGen
,后者本身又是生成器。 filterGen
接受一个函数和另一个生成器,并且仅yield
s(谓词)函数返回true
。
filterGen(x => x === 2, generateNumbers(1, 3)); // -> 2
isEven
和isOdd
只是filterGen
函数的谓词函数。
在makeNum
(应该为makeNumbers
)内部,仅检查传入的a
是否小于或等于b
并根据过滤后的整数序列生成一个新的Array
。
这是我为您提供解决方案的方法,解释在代码内,我已尽力简化了代码,欢迎提出任何建议。
const number_game = (x, y) => { let arr = []; // Depending of x > y condition, create the test method. // "test" will be a function that will check for even // number when x > y, otherwise will check for odd numbers. let test = (x > y) ? (n) => !Boolean(n % 2) : (n) => Boolean(n % 2); // Based on x > y condition, define the init and end number. let [init, end] = (x > y) ? [y, x] : [x, y]; !test(init) && init++; // Generate evens/odds number between init and end. while (init <= end) { arr.push(init), init += 2; } return arr; } // Test cases. console.log(JSON.stringify(number_game(1, 10))); console.log(JSON.stringify(number_game(10, 1))); console.log(JSON.stringify(number_game(10, 0))); console.log(JSON.stringify(number_game(-3, 13))); console.log(JSON.stringify(number_game(9, 9))); console.log(JSON.stringify(number_game(9, 8)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.