
本文详解如何编写一个函数,接收正整数 integer 和上限 limit,返回从 integer 开始、不超过 limit 的所有其正整数倍组成的数组(含 limit 本身,若其为倍数)。重点解决因变量作用域不当导致的测试失败问题。
本文详解如何编写一个函数,接收正整数 `integer` 和上限 `limit`,返回从 `integer` 开始、不超过 `limit` 的所有其正整数倍组成的数组(含 `limit` 本身,若其为倍数)。重点解决因变量作用域不当导致的测试失败问题。
在 Codewars 等编程练习平台中,函数需具备纯函数特性:每次调用都应独立计算、独立返回结果,不依赖也不污染外部状态。你原始代码中的核心问题在于将数组 arr 声明在函数外部(全局作用域):
const arr = []; // ❌ 全局变量 —— 多次调用会持续累积数据!
function findMultiples(integer, limit) {
// ... 推入元素到 arr
return arr; // 返回的是被反复修改的同一数组引用
}这导致连续测试(如 findMultiples(4,19) → findMultiples(5,25) → findMultiples(1,8))时,arr 不断追加新结果,最终输出类似 [4,8,12,16,5,10,15,20,25,1,2,3,4,5,6,7,8] 的混合数组,而测试框架期望每次调用都返回全新、纯净的数组。
✅ 正确做法是:在函数内部声明并初始化数组,确保作用域隔离:
function findMultiples(integer, limit) {
const result = []; // ✅ 每次调用都创建新数组
// 遍历 1 到最大可能的倍数系数 k,满足 k * integer <= limit
for (let i = 1; i * integer <= limit; i++) {
result.push(i * integer);
}
return result;
}该写法更简洁、可读性强,且天然避免了取余判断逻辑——直接用 i * integer <= limit 控制循环边界,既安全又高效。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
? 关键注意事项:
- 不要使用全局或闭包外的变量存储中间结果;
- 函数必须 return 数组,不能仅 console.log;
- 题目保证输入为正整数且 limit > integer > 0,无需额外校验 0 或负数;
- for 循环条件 i * integer <= limit 自动涵盖 limit 恰好为倍数的情形(如 findMultiples(2,6) → i=3 时 3*2===6,仍进入循环)。
✅ 最终推荐实现(健壮、简洁、符合测试要求):
function findMultiples(integer, limit) {
const multiples = [];
for (let i = 1; i * integer <= limit; i++) {
multiples.push(i * integer);
}
return multiples;
}调用示例:
console.log(findMultiples(2, 6)); // [2, 4, 6] console.log(findMultiples(4, 19)); // [4, 8, 12, 16] console.log(findMultiples(1, 8)); // [1, 2, 3, 4, 5, 6, 7, 8]
总结:编写算法函数时,作用域意识比算法逻辑更重要。一个看似微小的变量声明位置错误,会导致整个测试链路崩溃。始终让数据生命周期与函数调用周期严格对齐——这是写出可靠、可复用代码的第一步。

















