[英]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
中递增的计数是不好的做法。
我试过的:
global
变量名”,但这似乎是一个过去的解决方案。 我收到一条错误消息,指出unsupported operand type(s) for +: 'type' and 'int'
count +=1
而是count = count + 1
。 这也不起作用并引发相同的错误。 是否有更新单个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.