问题描述
一旦递归分支到达ans
的位置,但我失败了,我想向n==0
加1。
我尝试首先分配ans
并在其前面添加global
,但它们不起作用。
众所周知,我们可以在列表中进行操作。也就是说,基本案例可以为ans.append(1)
处理ans=[]
。我对在这里应该做什么感到困惑。
# Type: int n
def func(n)
def climb(n):
if n == 0:
ans += 1
elif n < 0:
ans += 0
else:
climb(n - 1)
climb(n - 2)
ans = 0
climb(n)
return ans
编辑:如果您认为我是否想念里面的return
。不,我要复制的机制类似这样,可以起作用:
# Type: string digits
def func(digits)
dict = {...}
def dfs(comb,i):
if i == len(digits):
ans.append(comb)
else:
for letter in dict[digits[i]]:
dfs(comb + letter,i + 1)
ans = []
if digits:
dfs("",0)
return ans
解决方法
您的代码无法正确解析:
- 在您最初的问题版本中,
return
出现在任何功能之外 -
ans
未在climb
内定义,并且如果不使用带有climb
或类似内容的声明,则不能修改nonlocal
之外的变量
没有问题,但是ans += 0
是无人操作。
以下是如何使代码解析和运行的方法:
def func(n):
def climb(n):
nonlocal ans
if n == 0:
ans += 1
elif n > 0:
climb(n - 1)
climb(n - 2)
ans = 0
climb(n)
return ans
print(func(5)) # 8
但是,这种工作方式使climb
成为具有副作用的函数,即它不是纯粹的。这不是最佳实践。您可以通过返回必须添加的值来使climb
变得纯净。这也使得不必将climb
包装到另一个函数中:
def climb(n):
if n == 0:
return 1
if n < 0:
return 0
return climb(n - 1) + climb(n - 2)
print(climb(5)) # 8
请注意,这都不代表有效的解决方案。您可以通过使用记忆来改善。