Swift中bestSum函数returningArray变量不保留值问题排查
问题原因
你遇到的是**变量名遮蔽(Variable Shadowing)**问题:你在guard语句中声明了一个和外层函数变量完全同名的局部变量returningArray,后续所有对这个名字的赋值操作都只会修改作用域更短的局部变量,完全不会影响外层函数真正要返回的returningArray变量,这就是两次打印结果不一致的根源。
具体逻辑拆解
你的for循环每一次迭代都是独立作用域:
- 首次迭代处理
number=2时,递归得到组合[2,2],此时外层returningArray为nil,进入guard的else分支,你声明了本次迭代的局部returningArray并赋值为[2,2],但这个值在本次迭代结束后就会销毁,外层函数的returningArray始终没有被修改。 - 第二次迭代处理
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
相关产品推荐
相关产品推荐

