递归地混合字符串

时间:2012-11-03 21:02:26

标签: python recursion

我试图以递归方式将两个字符串链接起来,但没有得到预期的结果:

对于两个字符串"abcd""xyz" - 预期输出应为"axbyczd"

def strr(str1, str2):

    def recstr(str1, str2, prn):
        if str1 == '':
            return str2
        if str2 == '':
            return str1
        else:
            return prn + recstr(str1[:len(str1)-len(prn)],str2[:len(str2)-len(prn)],prn)
    return recstr(str1, str2, '')

print strr("abcdef","12345")

1 个答案:

答案 0 :(得分:5)

当你用完任何一个字符串中的字符时,你返回另一个字符串而不将它连接到正在运行的累加器。看看s1s2为空时我做了什么。

此外,在递归的情况下,您有s1s2的非常复杂的切片。您实际上只需要对s1[1:]s2[1:]

进行切片

这应该这样做

def recstr(s1, s2, answer=''):
    if not s1:
        return answer+s2
    if not s2:
        return answer+s1
    return recstr(s1[1:], s2[1:], answer+s1[0]+s2[0])

In [15]: s1,s2 = 'abcd', 'xyz'

In [16]: print recstr(s1,s2)
axbyczd

当然,更简洁的方法是使用itertools.izip_longestitertools.chain.from_iterable

In [23]: zips = itertools.izip_longest(s1,s2, fillvalue='')

In [24]: ''.join(itertools.chain.from_iterable(zips))
Out[24]: 'axbyczd'

[感谢@AshwiniChaudhary指出fillvalue中的izip_longest参数

希望这有帮助