累积递归

时间:2014-12-06 05:29:58

标签: python recursion

给定一个字符串列表,我需要通过组合所有字符串的第一个字符来生成一个新字符串。我的解决方案:

def K(lst):
    if lst == []:
        return ""
    else:
        return lst[0][0] + K(lst[1:])

它有效,但我确定这不是累积递归。 我也尝试使用累积递归尝试这个问题,但我无法弄清楚正确的解决方案。

def K(lst):
    acc = ""
    if lst == []:
        return acc
    else:
        acc = acc + lst[0][0]
        return K(lst[1:])

我不知道如何改变acc

4 个答案:

答案 0 :(得分:2)

您不能在递归函数内声明累加器,因为在每次调用时都会重新定义它。你需要让它成为你函数的一个参数,这个常见的习惯用法就是创建一个辅助函数,它的定义中包含了累加器:

def K(lst):
    return _K(lst, [])

def _K(lst, acc):
    if lst == []:
       return acc
    else:
       head, tail = lst[0], lst[1:]
       return _K(tail, acc + head[0])

答案 1 :(得分:1)

我认为这就是你要找的东西:

def K(lst, s=""):
    if lst == []: return s
    else:         return K(lst[1:], s+lst[0][0])

虽然它具有累积递归的结构,但我不确定Python解释器是否可以在内部将其转换为累积递归。

答案 2 :(得分:0)

def func(ll,final):
    if len(ll)==1:
        return final+ll[0][0]
    else:
        return func(ll[1:],final+ll[0][0])

final=""
ll=["abc","bcd","cde"]


print func(ll,final)

你可以试试这个。

答案 3 :(得分:0)

我不会公开内部函数:

def K(lst):
    def sub(lst, acc):
        if lst:
            return sub(lst[1:], acc + lst[0][0])
        return acc
    return sub(lst, "")

然后

>>> print K(["abc","bcd","cde"])
abc

FWIW,有一种模仿你想要做的事情的方法,但它是糟糕的风格,只适用于Python 3,因为它需要非本地

def K(lst):
    acc = ""
    def sub(lst):
        if lst:
            nonlocal acc # Python3 only
            acc = acc + lst[0][0]
            return sub(lst[1:])
        return acc
    return sub(lst)

>>> print(K(["abc","bcd","cde"]))
abc