如何在Python函数中正确返回数值组合的计算结果
编程题调试问题
我正在编写适配以下预期效果的Python函数,目标输出完全匹配给定的调用结果:
combinations(2, 3)返回6combinations(3, 7, 4)返回84combinations(2, 3, 4, 5)返回120
实际运行自写代码时,调用combinations(1,2,3,4)意外返回了数值2,定位不到具体的逻辑错误位置,请求协助排查问题。
待调试代码
def combinations(*items): permu = [] for i in range(0, len(items)): if i == 0: permu.append(items[i]*items[i+1]) else: permu.append(items[i]*permu[i-1]) return sum(permu) print(combinations(1,2,3,4))
核心逻辑错误定位
逐行拆解代码执行流程就能明确偏差点:
- 需求匹配偏差
从所有预期输出可以推导,目标函数的实际计算规则是所有传入参数的连续累乘结果,而非基于排列组合的组合数逻辑。你当前的代码逻辑完全偏离了这个核心计算规则。 - 结果计算方式错误
代码中专门创建permu列表存储每一步的中间乘积,最后对列表做sum求和得到返回值,本质是把所有中间乘积加总,而不是取最终的累乘结果。 - 存在边界越界风险
循环遍历的索引最大值为len(items)-1,当走到i=0分支时会强制访问items[i+1]——如果传入的参数数量只有1个,就会直接触发索引越界报错。
以测试调用combinations(1,2,3,4)为例,你现有代码的完整执行流程为:
- 循环从索引0遍历到索引3
- i=0时,向permu列表存入
items[0]*items[1] = 1*2=2,此时列表为[2] - i=1时,向列表存入
items[1] * permu[0] = 2*2=4,此时列表为[2,4] - i=2时,向列表存入
items[2] * permu[1] = 3*4=12,此时列表为[2,4,12] - i=3时,向列表存入
items[3] * permu[2] =4*12=48,此时列表为[2,4,12,48] - 最终对列表求和得到返回值66,和预期的123*4=24完全不符,之前测试出现返回2的结果,大概率是临时调试时修改了返回值取列表第一个元素导致的。
修正后的可运行代码
不需要维护中间列表做求和计算,直接维护一个累乘变量即可实现需求:
def combinations(*items): total = 1 for num in items: total *= num return total # 匹配预期效果的测试结果 print(combinations(2, 3)) # 输出6 print(combinations(3, 7, 4)) # 输出84 print(combinations(2,3,4,5)) # 输出120 print(combinations(1,2,3,4)) # 输出24
内容的提问来源于stack exchange,提问作者millah
相关产品推荐
相关产品推荐

