递归函数add_mult_rec实现错误求助:计算结果与预期不符
问题排查与修正
错误原因分析
你的代码得到65的核心原因有两点:
- 操作符完全颠倒:
你要求“当前数为奇数则加上下一个数的运算结果”,但原代码中奇数分支用了乘法(num * add_mult_rec(num-1));要求“当前数为偶数则乘以下一个数的运算结果”,原代码中偶数分支用了加法(num + add_mult_rec(num-1)),这直接导致运算逻辑反转。 - 递归结合顺序错误:
原代码从num向1递归,运算结合顺序是右到左嵌套,比如调用add_mult_rec(5)时,实际执行的是:
这和你预期的左到右、乘法优先的运算顺序(5 * (4 + (3 * (2 + 1))) = 5 * (4 + 9) = 5 *13 =651 + (2*3) + (4*5))完全不符。
修正后的代码
要实现你预期的运算逻辑,我们可以调整递归的遍历方向和运算规则,先处理所有偶-奇对的乘法,再累加结果:
def add_mult_rec(num): # 基准情况:当遍历到超过num的位置时返回0 def helper(current): if current > num: return 0 if current % 2 == 1: # 奇数:直接加后续运算结果(后续先处理乘法) return current + helper(current + 1) else: # 偶数:乘下一个奇数,然后跳到下下一个位置 return current * (current + 1) + helper(current + 2) return helper(1)
调用add_mult_rec(5)时,执行过程为:1 + (2*3) + (4*5) =1+6+20=27,完全符合你的预期。
另一种简洁递归写法
如果只针对奇数输入(比如你的案例中num=5),可以简化为:
def add_mult_rec(num): if num ==1: return 1 # 奇数时,累加当前偶-奇对的乘积 + 左侧序列结果 return (num-1)*num + add_mult_rec(num-2)
调用add_mult_rec(5)返回(4*5)+add_mult_rec(3)=20+(2*3)+add_mult_rec(1)=20+6+1=27,同样正确。
内容的提问来源于stack exchange,提问作者Vortex
相关产品推荐
相关产品推荐

