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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:49:58