给定一个字符串列表,我需要通过组合所有字符串的第一个字符来生成一个新字符串。我的解决方案:
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
。
答案 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