LeetCode390递归求解返回值重置问题咨询
问题说明
使用递归方法求解LeetCode第390题时,代码前期执行逻辑符合预期,但触发递归终止条件len(arr)==1时,最终返回结果异常。经初步排查,递归栈回溯到上层调用时预期的返回值没有被正确传递,当前不追求最优效率解法,仅需要明确该场景下递归的运行逻辑,解决返回值异常的问题。
原始问题代码
class Solution: def lastRemaining(self, n: int) -> int: run_number=1 arr=[x for x in range(1,n+1)] res=0 def helper(arr,run_number,res): if len(arr)==1: res=arr[0] print(type(res)) print(res) return res elif run_number%2==1: arr = [v for i, v in enumerate(arr) if i % 2 == 1] print(arr) run_number+=1 helper(arr,run_number,res) else: arr = [v for i, v in enumerate(arr) if i % 2 == 0] print(arr) run_number+=1 helper(arr,run_number,res) print(type(helper)) x=helper(arr,run_number,res) return x
调试参考截图

问题根因
代码存在两个核心错误:
- 递归调用未传递返回值:两个分支中仅调用了
helper(),但没有用return将递归调用的结果返回给上一层。Python中函数如果没有显式return语句,默认返回None,因此只有最底层触发终止条件的递归层返回了正确值,上层所有递归调用都没有接住下层的返回值,最终最外层拿到的结果为空,并非res被重置为0。 - 冗余的
res参数:Python中整数是不可变类型,函数内部对形参res的赋值仅会修改当前函数栈帧内的局部变量,不会影响外层变量,传入这个参数没有实际作用。
修复方案
移除冗余的res参数,在所有递归调用位置前添加return,保证下层计算的结果可以逐层向上传递到最外层调用。
修复后可正常运行的代码:
class Solution: def lastRemaining(self, n: int) -> int: run_number = 1 arr = [x for x in range(1, n+1)] def helper(arr, run_number): if len(arr) == 1: return arr[0] elif run_number % 2 == 1: arr = [v for i, v in enumerate(arr) if i % 2 == 1] run_number += 1 return helper(arr, run_number) else: arr = [v for i, v in enumerate(arr) if i % 2 == 0] run_number += 1 return helper(arr, run_number) return helper(arr, run_number)
递归返回值的核心规则:递归的计算结果是从最底层终止条件开始逐层向上返回的,每一层调用都必须显式返回下一层调用的结果,否则计算结果会在中间层丢失,无法传递到最外层。
内容的提问来源于stack exchange,提问作者Spurthy Mutturaj
相关产品推荐
相关产品推荐

