JavaScript递归回文判断时slice切片跳过首元素返回错误结果排查
问题成因分析
核心错误共有三点:
- 递归传参逻辑错误:你每次递归调用时传入的是未经过滤的原始带空格输入
string的切片,而非已经完成特殊字符、空格过滤的净化后字符串。原始输入包含大量空格,你对带空格的字符串执行slice(1,-1)操作,每次切掉的并非净化后字符串的首尾字符,就是你日志中观察到“跳过首元素切片”现象的根本原因。 - 未统一字符大小写:现有过滤逻辑仅去除了非字母数字字符,没有做大小写统一转换,示例输入首尾的
A和a会被判定为不同字符,本身也会导致回文判断错误。 - 基线条件覆盖不全:现有逻辑只处理了长度为2时两字符不等的场景,未处理长度为2且两字符相等的合法回文场景,会导致这类情况进入无效递归,最终返回错误结果。
修复后可正常运行的代码
function palindrome(string) { // 过滤非字母数字字符,同时统一转为小写 let str = string.replace(/[^A-Za-z0-9]/g, '').toLowerCase() // 基线条件补全 if (str.length <= 1) return true if (str.length === 2) return str[0] === str[1] // 首尾字符相等时,递归传入砍掉首尾的净化后字符串 if (str[0] === str[str.length - 1]) { return palindrome(str.slice(1, -1)) } // 首尾不等直接判定为非回文 return false } console.log(palindrome("Anne I vote more cars race Rome to Vienna")) // 输出true
内容的提问来源于stack exchange,提问作者Milos Popovic
相关产品推荐
相关产品推荐

