递归地混合字符串

Mon*_*nty 1 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")
Run Code Online (Sandbox Code Playgroud)

ins*_*get 5

当您在任一字符串中用完字符时,您返回另一个字符串而不将其连接到正在运行的累加器.看看我做什么s1或什么时候s2是空的.

此外,在递归的情况下,你有一个非常复杂的切片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
Run Code Online (Sandbox Code Playgroud)

当然,更简洁的方法是使用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'
Run Code Online (Sandbox Code Playgroud)

[感谢@AshwiniChaudhary指出了fillvalue参数izip_longest]

希望这可以帮助

  • 使用`izip_longest`和`fillvalue`:`"".join(""."join(x)for x in izip_longest(s1,s2,fillvalue =""))` (2认同)