Go语言递归数组求和函数异常:预期得12却得到18求排查
问题排查与修复
你的代码运行结果理论上应该是12,但你的RemoveIndex函数存在一个容易引发意外问题的设计缺陷——它会修改原切片的底层数组,这可能在其他场景下导致数据错乱,不过在当前例子中这个问题没有直接引发结果错误。你得到18的原因大概率是运行的代码与你提供的版本不一致,比如递归逻辑或RemoveIndex函数存在笔误。
问题分析
Go的切片是引用类型,append操作在切片容量足够时,会直接在原底层数组上覆盖元素,而不是分配新的内存空间。你的RemoveIndex函数中,append(s[:index], s[index+1:]...)会直接修改原切片的底层数组:
- 初始切片
[2,4,6]调用RemoveIndex(arr,0)后,原底层数组会被修改为[4,6,6] - 再次调用
RemoveIndex处理[4,6]时,底层数组会被修改为[6,6,6]
虽然这个修改没有影响当前求和的结果(因为arr[0]在递归前已经被读取赋值),但会导致原切片的数据被意外篡改,这是非常危险的。
正确的递归求和实现
根本不需要编写RemoveIndex函数,直接通过切片的子切片特性即可实现安全的递归求和:
import ( "fmt" ) func recursiveSum(arr []int) int { if len(arr) == 0 { return 0 } return arr[0] + recursiveSum(arr[1:]) } func main() { var arr = []int{2, 4, 6} fmt.Println(recursiveSum(arr)) // 输出12 }
这种方式不会修改原切片的任何数据,逻辑更简洁,性能也更好。
关于你得到18的推测
如果你确实得到了18,可能的原因包括:
- 递归函数中重复累加了元素,比如错误地写成
sum := arr[0] + arr[0] + recursiveSum(...) RemoveIndex函数实现错误,比如没有正确删除元素,导致递归过程中重复处理了某些元素- 运行的代码与你提供的版本不一致,比如递归终止条件写错(例如
len(arr) == 2时返回arr[0]+arr[1],但后续逻辑错误)
内容的提问来源于stack exchange,提问作者Tarik
相关产品推荐
相关产品推荐

