1

我试图递归地将两个字符串链接在一起,但没有得到预期的结果:

对于两个字符串"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")
4

1 回答 1

5

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

此外,在您的递归情况下,您有一个非常复杂的s1and切片s2。你真的应该只需要切片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_longestand itertools.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]

希望这可以帮助

于 2012-11-03T21:05:31.767 回答