如何在递归的每个基本情况下添加数字?(Python3)?
我想在递归分支到达如何在递归的每个基本情况下添加数字?(Python3)?,python,python-3.x,recursion,Python,Python 3.x,Recursion,我想在递归分支到达n==0的位置后,将1添加到ans,但它失败了 起初我尝试分配ans,并在其前面添加global,但它们不起作用 大家都知道我们可以在名单上做这件事。也就是说,基本情况可以为ans=[]处理ans.append(1)。我不知道我应该在这里做什么 #类型:int n def func(n) def爬升(n): 如果n==0: ans+=1 elif n
n==0的位置后,将1添加到ans
,但它失败了
起初我尝试分配ans
,并在其前面添加global
,但它们不起作用
大家都知道我们可以在名单上做这件事。也就是说,基本情况可以为ans=[]
处理ans.append(1)
。我不知道我应该在这里做什么
#类型:int n
def func(n)
def爬升(n):
如果n==0:
ans+=1
elif n<0:
ans+=0
其他:
爬升(n-1)
爬升(n-2)
ans=0
爬升(n)
返回ans
编辑:以防你认为我是否错过了里面的返回。不,我想复制的机制是这样的,它可以工作:
#类型:字符串数字
def func(数字)
dict={…}
def dfs(梳,i):
如果i==len(位数):
附加(梳)
其他:
对于dict[数字[i]]中的字母:
dfs(梳+字母,i+1)
ans=[]
如果是数字:
dfs(“,0)
返回ans
您的代码无法正确解析:
- 在原始问题版本中,
return
出现在任何函数之外
ans
未在gramb
内部定义,并且在gramb
外部修改变量时,必须使用非本地
或类似声明
这不是问题,但是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
然而,这种工作方式使爬升
成为一种具有副作用的功能,即它不是纯粹的。这不是最佳做法。通过返回必须添加的值,可以使gramb
变得纯粹。这也使得无需将爬升
包装到另一个功能中:
def climb(n):
if n == 0:
return 1
if n < 0:
return 0
return climb(n - 1) + climb(n - 2)
print(climb(5)) # 8
def爬升(n):
如果n==0:
返回1
如果n<0:
返回0
返回爬升(n-1)+爬升(n-2)
打印(爬升(5))#8
请注意,两者都不是有效的解决方案。您可以通过使用备忘录进行改进。最后三行不是您的功能的一部分。如果是这样,请提供最终返回值所属的函数。@trincot它们不应包括在爬升
函数中。这是leetcode#70爬楼梯解决方案的一部分。我想通过撤销递归函数来计算数字,然后返回最终答案。return ans
在函数外部无效。函数中未定义和ans
。这段代码不会解析。@trincot谢谢你的评论,我对我的答案做了一些修改,使它更清楚。谢谢,这就是我想问的。抱歉,我没有在原始帖子中输入def func(n)
。我的错误是将global ans=0
赋值给外部,但我应该在递归函数中键入非局部ans
。因为当我为ans=[]
使用append
函数时(在我文章的第二个示例中显示),我不需要在内部分配非本地的东西。我不明白为什么。当您使用append
时,您不会为ans
指定新值,而只是对其进行变异。这在没有非本地的情况下是允许的。但分配一个新值(使用=
)则是另一回事。