如何在每个基本递归情况下加数字?Python3?

问题描述

一旦递归分支到达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

请注意,这都不代表有效的解决方案。您可以通过使用记忆来改善。