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

为何该mutate函数触发递归时返回值为undefined?

问题分析与修复方案

核心问题:递归分支无返回值

你的mutate()函数在递归触发时返回undefined,是因为当随机生成的新碱基与原碱基相同时,你调用了this.mutate()但没有将递归的结果返回,导致当前函数执行到此处后默认返回undefined。

额外问题:碱基替换位置错误

当前代码先随机获取碱基,再用indexOf()找索引,若DNA链存在多个相同碱基,indexOf()只会返回第一个匹配项的索引,导致你替换的并非最初随机选中的位置。

修复后的代码

// Returns a random DNA base
const returnRandBase = () => {
  const dnaBases = ['A', 'T', 'C', 'G']
  return dnaBases[Math.floor(Math.random() * 4)] 
}

// Returns a random single strand of DNA containing 15 bases
const mockUpStrand = () => {
  const newStrand = []
  for (let i = 0; i < 15; i++) {
    newStrand.push(returnRandBase())
  }
  return newStrand
}

const pAequorFactory = (specimenNum,dna) => {
  return {
    spicimenNum: specimenNum,
    dna: dna,
    mutate() {
      // 先随机选中目标索引,确保修改的是正确位置
      const randomIndex = Math.floor(Math.random() * this.dna.length);
      const originalBase = this.dna[randomIndex];
      let newBase;
      
      // 用do-while循环生成不同的碱基,替代递归更高效
      do {
        newBase = returnRandBase();
      } while (newBase === originalBase);
      
      // 替换并返回新碱基
      this.dna[randomIndex] = newBase;
      return newBase;
    },
  }
}

console.log(pAequorFactory(1,mockUpStrand()).mutate());

关键改动说明

  • 先随机生成索引而非碱基,确保替换的是真正选中的位置
  • 用do-while循环替代递归,避免递归返回值问题,同时减少栈开销
  • 逻辑更直观,确保生成的新碱基一定与原碱基不同

内容的提问来源于stack exchange,提问作者Your Friend

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:21:36