JavaScript 名为 FizzBuzz 的编码问题
JavaScript coding problem called FizzBuzz
我想弄清楚我在这个问题上做错了什么。我似乎遗漏了一些不允许我的代码工作的东西。我需要使用一个函数来创建一个数组,该数组采用一个数字 n,并从数字 1 到 16 循环遍历一个数组,同时还用字符串 'fizz' 替换所有可被 3 整除的数字,并且所有可整除的数字用单词 'buzz' 乘以 5,任何可被两者整除的数字都必须替换为字符串 'fizzbuzz'。
我已经检查过这个问题好几次了,但出于某种原因,当我的结果被记录到控制台时,我的结果一直只是一个空数组。如果有人能给我一些关于为什么我的代码不起作用的提示,以便我可以更容易地理解这个概念,我将不胜感激。这是我的代码:
const results = [];
const fizzbuzz = (n) => {
var results = []
for (let n = 1; results.length < 16; n++) {
if (n % 3 === 0 && n % 5 === 0) {
results.push('FizzBuzz')
} else if (n % 3 === 0) {
results.push('fizz');
} else if (n % 5 === 0) {
results.push('buzz')
} else {
results.push(n)
}
}
return results
};
fizzbuzz(16);
console.log(results);
结果应该是这样的:
[1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16]
但这就是我不断得到的答案:
[]
你的 fizzbuzz 函数 returns 结果,所以只需将其分配给一个变量并记录它:
var results = fizzbuzz(16);
console.log(results);
您的第一个问题是在函数外部声明的 results
变量和在函数内部声明的 results
变量是完全不同的变量。你只需要在函数中声明变量,然后你可以创建一个新的变量来保存函数结果:
const res = fizzbuzz(16);
console.log(res);
或更简单:
console.log(fizzbuzz(16));
第二个问题是在你的 for 循环中,当你应该创建一个新变量(通常称为 i
)时,你正在重新分配 n
。当您应该使用变量 n
:
时,您还使用静态数字 (16) 作为表达式 results.length < 16
中的限制
for (let i = 0; results.length < n; i++) {
if (i % 3 === 0 && i % 5 === 0) {
results.push('FizzBuzz')
} else if (i % 3 === 0) {
results.push('fizz');
} else if (i % 5 === 0) {
results.push('buzz')
} else {
results.push(i)
}
}
总的来说,您采用了正确的方法,但您应该检查变量和 for 循环,因为您对它们的使用有点不正确。
您正在函数内部玩另一个 results
,函数外部 result
将保持为空。如果现在删除函数内部的变量,则每个操作都将针对同一个变量。
const results = [];
const fizzbuzz = (num) => {
for(let n=1; n<num; n++){
if(n%3 === 0 && n % 5 === 0){
results.push('FizzBuzz')
}
else if(n % 3 === 0){
results.push('fizz');
}
else if(n % 5 === 0){
results.push('buzz')
}
else {
results.push(n)
}
}
};
fizzbuzz(16);
console.log(results);
您的代码有两个明显的问题。
- 你定义变量results两次,一次是常量,一次是var。
如果删除 var results = []
定义,您的代码将正常工作,因为它能够通过闭包存储结果。基本上,const 结果的范围封装了函数的范围,因此您的函数可以访问 const results = []
您的函数未返回任何内容。如果您试图通过闭包存储结果,这不会成为问题,但查看您的代码,这不是您的意图。你应该做的是将结果存储在一个变量中,如
const results = fizzbuzz(16)
这是我的 FizzBuzz 实现,它根据规则使用 Array.from()
生成带有 fizz/buzz/number 的数组:
const fizzbuzz = length => Array.from({ length }, (_, i) => {
if (i % 3 === 0 && i % 5 === 0) return 'FizzBuzz';
if (i % 3 === 0) return 'fizz';
if (i % 5 === 0) return 'buzz';
return i;
})
const results = fizzbuzz(16); // assign the return value of the function to results
console.log(results);
我想弄清楚我在这个问题上做错了什么。我似乎遗漏了一些不允许我的代码工作的东西。我需要使用一个函数来创建一个数组,该数组采用一个数字 n,并从数字 1 到 16 循环遍历一个数组,同时还用字符串 'fizz' 替换所有可被 3 整除的数字,并且所有可整除的数字用单词 'buzz' 乘以 5,任何可被两者整除的数字都必须替换为字符串 'fizzbuzz'。
我已经检查过这个问题好几次了,但出于某种原因,当我的结果被记录到控制台时,我的结果一直只是一个空数组。如果有人能给我一些关于为什么我的代码不起作用的提示,以便我可以更容易地理解这个概念,我将不胜感激。这是我的代码:
const results = [];
const fizzbuzz = (n) => {
var results = []
for (let n = 1; results.length < 16; n++) {
if (n % 3 === 0 && n % 5 === 0) {
results.push('FizzBuzz')
} else if (n % 3 === 0) {
results.push('fizz');
} else if (n % 5 === 0) {
results.push('buzz')
} else {
results.push(n)
}
}
return results
};
fizzbuzz(16);
console.log(results);
结果应该是这样的:
[1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16]
但这就是我不断得到的答案:
[]
你的 fizzbuzz 函数 returns 结果,所以只需将其分配给一个变量并记录它:
var results = fizzbuzz(16);
console.log(results);
您的第一个问题是在函数外部声明的 results
变量和在函数内部声明的 results
变量是完全不同的变量。你只需要在函数中声明变量,然后你可以创建一个新的变量来保存函数结果:
const res = fizzbuzz(16);
console.log(res);
或更简单:
console.log(fizzbuzz(16));
第二个问题是在你的 for 循环中,当你应该创建一个新变量(通常称为 i
)时,你正在重新分配 n
。当您应该使用变量 n
:
results.length < 16
中的限制
for (let i = 0; results.length < n; i++) {
if (i % 3 === 0 && i % 5 === 0) {
results.push('FizzBuzz')
} else if (i % 3 === 0) {
results.push('fizz');
} else if (i % 5 === 0) {
results.push('buzz')
} else {
results.push(i)
}
}
总的来说,您采用了正确的方法,但您应该检查变量和 for 循环,因为您对它们的使用有点不正确。
您正在函数内部玩另一个 results
,函数外部 result
将保持为空。如果现在删除函数内部的变量,则每个操作都将针对同一个变量。
const results = [];
const fizzbuzz = (num) => {
for(let n=1; n<num; n++){
if(n%3 === 0 && n % 5 === 0){
results.push('FizzBuzz')
}
else if(n % 3 === 0){
results.push('fizz');
}
else if(n % 5 === 0){
results.push('buzz')
}
else {
results.push(n)
}
}
};
fizzbuzz(16);
console.log(results);
您的代码有两个明显的问题。
- 你定义变量results两次,一次是常量,一次是var。
如果删除 var results = []
定义,您的代码将正常工作,因为它能够通过闭包存储结果。基本上,const 结果的范围封装了函数的范围,因此您的函数可以访问 const results = []
您的函数未返回任何内容。如果您试图通过闭包存储结果,这不会成为问题,但查看您的代码,这不是您的意图。你应该做的是将结果存储在一个变量中,如
const results = fizzbuzz(16)
这是我的 FizzBuzz 实现,它根据规则使用 Array.from()
生成带有 fizz/buzz/number 的数组:
const fizzbuzz = length => Array.from({ length }, (_, i) => {
if (i % 3 === 0 && i % 5 === 0) return 'FizzBuzz';
if (i % 3 === 0) return 'fizz';
if (i % 5 === 0) return 'buzz';
return i;
})
const results = fizzbuzz(16); // assign the return value of the function to results
console.log(results);