You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]

代码解释:

  1. replacementMap:把每个元素对应的替换数组映射起来,不用写一堆if-else,更简洁。
  2. flatMap方法:相当于先map每个元素到替换数组,再用flat()扁平化一层,正好符合我们的需求——把每个元素替换成子数组后,合并成一个新数组。
  3. 循环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的结果,然后对这个结果里的每个元素执行替换,得到当前次数的数组。

验证结果

咱们对照你给出的生成过程:

  1. 初始(递归0次):[1]
  2. 递归1次:[1,0,1]
  3. 递归2次:[1,0,1,0,0,1,0,1]
  4. 递归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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:24:41