Python递归函数调用

3

我正在尝试实现一个递归函数,但遇到了一些困难,希望你的指导。比如,我们尝试创建一个名为sliding的函数来做到这一点。

sliding("python", 2)
["py", "yt", "th", "ho", "on"]

也就是说,对于所选整数,我们沿着字符串滑动,获取适当长度的子字符串,然后将它们全部返回到一个列表中。
现在让我来(愚蠢地)尝试一下递归地定义它:
def sliding(string,k):
  return s if len(string)==k else [string[:k]].append(sliding(string[1:],k))

这种方法行不通,主要是因为list.append()是就地操作,并返回一个None。所以我的问题是 - 即使有很多Python方法是在原地发生的,是否有一种方法可以执行这种递归函数?

到目前为止,以下是最好的方法:

def sliding(s,k):
    if len(s)==k:
        return s
    else:
        temp = [s[:k]]
        temp.append(sliding(s[1:],k) ) 
        return temp

这将导致

sliding("python",k=2)
['py', ['yt', ['th', ['ho', 'on']]]]

这显然不是期望的输出,但方向正确。还有其他什么方法可以做到这一点?感谢您的想法。


1
你是否知道列表中的 + 运算符? - Nayuki
可能把“append”改为“extend”。 - David Greydanus
5个回答

5

使用+运算符获取新的连接列表:

def sliding(s, k):
    if len(s) < k: return []
    else: return [s[:k]] + sliding(s[1:], k)

3

不使用递归的解决方案,只需对 切片语法 进行简单操作。

def sliding(s, i):
    return [s[n:n+i] for n in xrange(len(s)-i+1)]

assert sliding("python", 2) == ["py", "yt", "th", "ho", "on"]
assert sliding("python", 3) == ["pyt", "yth", "tho", "hon"]

1
这个怎么样?
def sliding(string, k):
    return [string[i:i+k] for i in range(len(string)-k+1)]

1
这里有迭代和递归两个版本:
def sliding(s, window=2):
    for ind in range(len(s) - (window - 1)):
        yield s[ind:ind+window]


def sliding_recursive(s, window=2, ind=0):
    if ind > len(s) - window:
        return []
    strings = [s[ind: ind+window]] + sliding_recursive(s, window, ind+1)
    return strings


>>> list(sliding('python'))
['py', 'yt', 'th', 'ho', 'on']
>>> list(sliding('python', window=3))
['pyt', 'yth', 'tho', 'hon']

>>> sliding_recursive('python')
['py', 'yt', 'th', 'ho', 'on']
>>> sliding_recursive('python', window=3)
['pyt', 'yth', 'tho', 'hon']

0
我建议:
temp.extend(sliding(s[1:],k) ) 

由于您将获得许多嵌套对象,建议使用extend而不是append


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接