如何将此函数重写为递归函数?

时间:2012-05-13 02:21:22

标签: python function recursion

def digits(n):
    res = []
    while n > 0:
        res.append(n % 10)
        n /= 10
    return res

我想重写这个函数,所以它使用递归。我现在迷失了该做什么。谁能给我一些方向?

4 个答案:

答案 0 :(得分:6)

要创建递归函数,您需要确定两件事:

  

1)基本情况 - 您想要停止递归的条件

     

2)一般情况 - 在每个输入上做什么,但基本情况

你已经找到了这两件事,基本情况是while循环条件,一般情况是while循环的内部。尝试使用此信息继续前进。

答案 1 :(得分:2)

这是一个可能的解决方案:

def digits(n):
    if n < 10:
        return [n]
    return digits(n/10) + [n%10]

digits(123)
> [1, 2, 3]

上述解决方案修复了代码中的错误,您以相反的顺序返回数字。另请注意,n必须是大于或等于零的整数才能生成正确的结果。

以下是它的工作原理:

  1. 如果该数字小于10,则返回一个包含该号码的列表,因为没有更多数字需要处理
  2. 如果数字大于9,则获取当前数字中的最后一位数字,并将其添加到列表的末尾,该结果是在较小的数字上递归调用digits - 即没有最后一个数字的数字我们刚刚处理的数字。
  3. digits(123)的调用在递归的每一步都是这样的:

    digits(123) = digits(123/10) + [3]
    digits(12)  = digits(12/10)  + [2]
    digits(1)   = [1]
    

    现在我们进入调用堆栈:

    [1]
    [1] + [2]
    [1, 2] + [3]
    [1, 2, 3]
    

    编辑:

    接受@ thg435的挑战,这是一个尾递归解决方案:

    def digits(n):
        def loop(i, acc):
            if i < 10:
                return [i] + acc
            return loop(i/10, [i%10] + acc)
        return loop(n, [])
    

答案 2 :(得分:0)

当你使用递归时,一个很好的基础是要检查两个案例,一个基本案例和一个递归案例。基本情况是程序返回的条件和结果,在您的情况下,基本情况是当n> 1时。 0(如果你认为它像while循环一样,那就是while循环退出的条件)。循环未完成时会发生递归情况(可能有多个),如果你比较一个while循环,这基本上就是循环的主体。在递归情况结束时,您需要使用对输入的更改再次调用该函数,在本例中为n / 10.

因此,您的函数定义类似于:

def digits(n):

对于基本情况,您要检查n是否为0,如果是,则返回空列表:

    if n <= 0:
        return []

现在,在递归的情况下,你想要将n%10附加到列表并再次调用你的函数,只是你想用不同的n调用它,改变你在while循环中的颜色:

    else:
        return [n%10]+digits(n/10)

所以,如果你追踪这个,对于每个递归的情况,你得到一个包含n%10的列表,然后它添加新调用的结果,它将是(n / 10)%10或空列表。例如,运行n = 100的此函数会像这样分解:

newlist = digits(100)
newlist = [100%10]+digits(100/10)
newlist = [100%10]+([10%10] + digits(10/10))
newlist = [100%10]+([10%10] + ([1%10] + digits(10/10)))
newlist = [100%10]+([10%10] + ([1%10] + ([])))
newlist = [0,0,1]

嵌套的parens用于显示函数数字如何内联重写。

答案 3 :(得分:0)

def digits(n):
    res = []
    res.append(n%10)
    n /= 10
    if n != 0:
        return res + digits(n)
    else:
        return res