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

Swift中bestSum函数returningArray变量不保留值问题排查

问题原因

你遇到的是**变量名遮蔽(Variable Shadowing)**问题:你在guard语句中声明了一个和外层函数变量完全同名的局部变量returningArray,后续所有对这个名字的赋值操作都只会修改作用域更短的局部变量,完全不会影响外层函数真正要返回的returningArray变量,这就是两次打印结果不一致的根源。

具体逻辑拆解

你的for循环每一次迭代都是独立作用域:

  1. 首次迭代处理number=2时,递归得到组合[2,2],此时外层returningArray为nil,进入guard的else分支,你声明了本次迭代的局部returningArray并赋值为[2,2],但这个值在本次迭代结束后就会销毁,外层函数的returningArray始终没有被修改。
  2. 第二次迭代处理number=4时,递归得到组合[4],同样因为外层returningArray还是nil,再次声明本次迭代的局部returningArray赋值为[4],if块内的print打印的是这个局部变量的[4],但迭代结束后局部变量销毁,外层函数的returningArray依旧保留之前递归过程中缓存的错误值,所以if块外的print打印的是外层的旧值Optional([2,2])。

修复方案

避免使用同名变量遮蔽外层作用域,直接修改外层的returningArray即可,修改后的核心代码如下:

for number in numbers {
    let remainder = targetNumber - number
    if var bestSumValueArray =  bestSum(targetNumber: remainder, numbers: numbers, memoryDictionary: &memoryDictionary){
        bestSumValueArray.append(number)
        // 不要声明同名局部变量,用不同的名字接收当前的最优解
        guard let currentBest = returningArray else {
            // 直接赋值给外层的returningArray
            returningArray = bestSumValueArray
            continue
        }
        if bestSumValueArray.count < currentBest.count{
            // 直接修改外层的returningArray
            returningArray = bestSumValueArray
        }
        print(returningArray)
    }
    print(returningArray)
}

修改后传入targetNumber=4、numbers=[2,4]就会返回预期的Optional([4])。

内容的提问来源于stack exchange,提问作者Jaffer Sheriff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:54:04