我试图以递归方式将两个字符串链接起来,但没有得到预期的结果:
对于两个字符串"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")
答案 0 :(得分:5)
当你用完任何一个字符串中的字符时,你返回另一个字符串而不将它连接到正在运行的累加器。看看s1
或s2
为空时我做了什么。
此外,在递归的情况下,您有s1
和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_longest
和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
参数
希望这有帮助