为何该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
相关产品推荐
相关产品推荐

