JavaScript音乐用途累积数组:按指定规则递归生成数组的方法
实现递归替换生成数组的JavaScript方案
这是个很清晰的递归替换问题,咱们一步步来实现它:
核心思路
首先明确规则:
- 元素
1要替换成[1, 0, 1] - 元素
0要替换成[0, 0] - 递归次数就是我们需要重复替换的轮数,比如输入1、递归3次,就是从
[1]开始,连续做3轮替换。
我们可以用迭代或者递归两种方式实现,两种方案我都给你写出来:
方案1:迭代实现(更直观,适合固定次数)
这种方式用循环来控制替换轮数,代码可读性很高:
function generateArray(initialValue, recursionTimes) { // 先把替换规则存成对象,方便快速查找 const replacementMap = { 1: [1, 0, 1], 0: [0, 0] }; // 初始化数组,从初始值开始 let currentArr = [initialValue]; // 循环执行指定次数的替换 for (let i = 0; i < recursionTimes; i++) { // 用flatMap遍历每个元素,替换成对应数组并自动扁平化 currentArr = currentArr.flatMap(item => replacementMap[item]); } return currentArr; } // 测试你的场景:输入1,递归3次 const finalArray = generateArray(1, 3); console.log(finalArray); // 输出:[1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,1]
代码解释:
replacementMap:把每个元素对应的替换数组映射起来,不用写一堆if-else,更简洁。flatMap方法:相当于先map每个元素到替换数组,再用flat()扁平化一层,正好符合我们的需求——把每个元素替换成子数组后,合并成一个新数组。- 循环
recursionTimes次,每一轮都基于上一轮的数组生成新的数组,最终得到结果。
方案2:递归实现(更贴合递归问题的逻辑)
如果喜欢用递归的思路来写,也可以这样实现:
function generateArrayRecursive(initialValue, recursionTimes) { const replacementMap = { 1: [1, 0, 1], 0: [0, 0] }; // 递归终止条件:当递归次数为0时,直接返回初始值的数组 if (recursionTimes === 0) { return [initialValue]; } // 先递归生成上一轮的结果,再对每个元素做替换 const prevArr = generateArrayRecursive(initialValue, recursionTimes - 1); return prevArr.flatMap(item => replacementMap[item]); } // 测试 const recursiveResult = generateArrayRecursive(1, 3); console.log(recursiveResult); // 输出和迭代方案完全一致
代码解释:
- 终止条件很关键:当递归次数减到0时,我们就返回最开始的初始数组,不再继续递归。
- 每一次递归都会先获取次数减1的结果,然后对这个结果里的每个元素执行替换,得到当前次数的数组。
验证结果
咱们对照你给出的生成过程:
- 初始(递归0次):
[1] - 递归1次:
[1,0,1] - 递归2次:
[1,0,1,0,0,1,0,1] - 递归3次:
[1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,1]
两种方案的输出都完全匹配这个过程,没问题~
内容的提问来源于stack exchange,提问作者Francisco Colasanto
相关产品推荐
相关产品推荐

