You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归函数中优雅更新共享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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:24:33