递归函数中优雅更新共享int变量的方法咨询
递归中简洁更新整数计数器的方案
你当前用长度为1的列表在递归DFS中计数,觉得这种写法不够优雅,以下是两种更简洁的解决方案:
方案1:让DFS函数返回计数结果
这是最符合递归思想的写法,让每个DFS调用返回当前分支下符合条件的数字数量,外层直接累加返回值即可,无需依赖外部变量:
class Solution: def confusingNumberII(self, N: int) -> int: valid = {0: 0, 1: 1, 6: 9, 8: 8, 9: 6} def dfs(n, rotate, digit): # 当前数符合条件则计数1,否则0 count = 1 if n != rotate else 0 for num in valid: cur = n * 10 + num if cur > N: continue # 累加子分支的计数结果 count += dfs(cur, valid[num] * digit + rotate, digit * 10) return count total = 0 for num in valid: if num != 0: total += dfs(num, valid[num], 10) return total
方案2:使用nonlocal关键字
你之前尝试全局变量失败,是因为count是类方法内的局部变量,而非模块级全局变量。改用nonlocal可以让嵌套的DFS函数直接修改外层方法的count变量,写法比列表更直观:
class Solution: def confusingNumberII(self, N: int) -> int: valid = {0: 0, 1: 1, 6: 9, 8: 8, 9: 6} count = 0 def dfs(n, rotate, digit): nonlocal count if n != rotate: count += 1 for num in valid: cur = n * 10 + num if cur > N: return dfs(cur, valid[num] * digit + rotate, digit * 10) for num in valid: if num != 0: dfs(num, valid[num], 10) return count
之前尝试失败的原因说明
- 全局变量报错:
global关键字用于访问模块级的全局变量,而你在类方法内定义的count是局部变量,用global会导致Python找不到对应的全局变量,进而引发类型错误。 - 传参无效果:Python中整数是不可变类型,传参时传递的是值的副本,递归函数内修改的是副本,不会影响外层的原变量,因此无法更新计数。
内容的提问来源于stack exchange,提问作者g1wonwon
相关产品推荐
相关产品推荐

