递归调用返回后for循环未继续遍历剩余元素的原因是什么
问题原因分析
你对递归执行流程的理解完全正确,第二个函数实例执行结束后确实会回到第一个实例继续执行,你误以为没有恢复是两个代码设计问题导致的错觉:
- 核心原因是实例属性
self.func_count的打印误导了你self.func_count是属于Solution实例的全局共享变量,不是每个helper调用栈的局部变量。当第二个helper执行时把self.func_count自增到2,等递归回到第一个helper的for循环继续执行时,打印的self.func_count已经是2了,你会误以为这还是第二个函数的循环输出,实际上已经回到第一个函数的执行上下文了。 - 你在if分支中修改了当前函数作用域的x、y入参值,会干扰后续循环的计算结果
第一层helper的初始入参是x=0,y=1,你在匹配到符合条件的方向时执行了x = x+i; y = y+j,把当前函数的x、y改成了0、0,后续for循环遍历剩下的方向时,计算x+i,y+j用的是修改后的0、0,不是初始的入参值,也会干扰你对执行流程的判断。 - 额外提示:你当前的代码中没有往
self.changed里添加任何元素,如果后续业务逻辑需要标记已访问的坐标,记得在符合条件时把坐标加入该字典,避免出现无限递归。
验证方案
你可以把计数改成每个栈独有的局部变量,同时备份初始坐标避免修改,就能清晰看到递归返回后的执行流程:
class Solution: def main(self,x,y): self.directions = [(-1, 0), (0, -1), (1, 0), (0,1)] self.changed = {} self.helper(x,y, count=1) def helper(self, x, y, count): print("当前执行的helper层级:", count) # 备份初始坐标,避免修改影响后续循环 origin_x, origin_y = x, y for i, j in self.directions: print(f"层级{count}的for循环迭代,方向({i},{j})") next_x = origin_x + i next_y = origin_y + j print(f"下一个坐标:{next_x},{next_y}") if next_x == 0 and next_y == 0: if (next_x, next_y) not in self.changed: # 直接传计算后的新坐标,不修改当前作用域的x、y self.helper(next_x, next_y, count+1) S = Solution() S.main(0,1)
运行上述代码就能看到,层级2的helper执行完后,层级1的for循环会继续执行剩下的两个方向,完全符合你对递归的理解。
内容的提问来源于stack exchange,提问作者Pyson
相关产品推荐
相关产品推荐

