Codewars代码练习求助:console.log输出正确但函数无正确返回值
问题排查:递归函数
findN能打印结果但无法正确返回值 我一眼就看出问题所在了——这是递归函数里非常常见的一个坑:你在递归调用的时候没有返回调用结果,导致底层递归找到的正确值无法传递回顶层调用。
咱们来拆解下你的代码逻辑:
当你调用findN(4183059834009)时,函数会一层层递归下去,直到某个分支触发v == m,这时你用console.log(newN)打印出了正确值,并且return newN。但问题是,这个返回值只回到了它的上层递归调用,而你的上层调用里只是执行了findN(m,n,v);,没有把这个结果再return出去。这样一来,上层函数执行完递归后没有返回任何内容,最终整个函数的返回值就变成了undefined,而不是你期望的那个正确的newN。
修复方案
只需要修改递归调用的那一行,把它的结果return出去就行,同时可以删掉多余的newN = null;语句:
function findN(m, n = 1, v = 0) { if (m == 1) { return n; } else if (v < m) { v += n * n * n; n++; let newN = n - 1; if (v == m) { console.log(newN); return newN; } // 关键修改:返回递归调用的结果,让值逐层传递回去 return findN(m, n, v); } else if (v > m) { return -1; } }
为什么这样改有效?
每一层递归调用的返回值都会被上层接收并继续返回,直到最开始的函数调用。这样当底层递归找到正确值时,这个值会沿着递归栈一路传递回来,最终成为整个函数的返回结果,而不是在中间层就“消失”了。
现在你再调用findN(4183059834009),不仅控制台会打印结果,函数也会正确返回这个值啦。
内容的提问来源于stack exchange,提问作者user9145607
相关产品推荐
相关产品推荐

