繁体   English   中英

在递归函数中递增全局变量

[英]incrementing a global variable within a recursive function

我知道这听起来像是一个重复的问题——我知道是因为我点击了 10 个标记相同内容的帖子,但请听我说完。

我有如下功能

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):
            if n != rotate:
                count[0]+=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[0]

而且我觉得设置一个 len-1-list 来跟踪将在dfs中递增的计数是不好的做法。

我试过的:

  • 我读过 10 篇不同的 stackoverflow 帖子,上面写着“只需在将更新它的函数中声明global变量名”,但这似乎是一个过去的解决方案。 我收到一条错误消息,指出unsupported operand type(s) for +: 'type' and 'int' 在此处输入图像描述
  • 我还读过一篇文章说我应该增加 count = 0 而不是count +=1而是count = count + 1 这也不起作用并引发相同的错误。
  • 我也尝试过将 count 作为变量传入来更新它——它什么也没做,整个函数最终返回 0。

是否有更新单个int变量的干净方法? 我真的觉得更新变量不应该这么笨重。

您可以通过让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):
            count = int(n != rotate)
            for num in valid:
                cur = n * 10 + num
                if cur > N:
                    break
                count += dfs(cur, valid[num] * digit + rotate, digit * 10)
            return count

        count = 0
        for num in valid:
            if num != 0:
                count += dfs(num, valid[num], 10)
        return count

对于它的价值,你可以用更函数化的编程风格重写上面的代码,像这样:

from itertools import takewhile

class Solution:
    def confusingNumberII(self, N: int) -> int:
        valid = {0: 0, 1: 1, 6: 9, 8: 8, 9: 6}

        def dfs(n, rotate, digit):
            return int(n != rotate) + sum(
                dfs(n * 10 + num, valid[num] * digit + rotate, digit * 10)
                    for num in takewhile(lambda num: n * 10 + num <= N, valid)
            )

        return sum(
            dfs(num, valid[num], 10)
                for num in valid
                    if num != 0
        )

我同意@trincot 的回答。 不过,我想补充一件事:总有一种方法可以避免在函数内部使用全局变量。 即使在递归函数中。 因此,尽可能避免使用它们,因为它们会使您的代码更不灵活且更难维护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM