我试图递归地链接两个字符串,但没有得到预期的结果:
对于两个字符串"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)
当您在任一字符串中用完字符时,您返回另一个字符串而不将其连接到正在运行的累加器.看看我做什么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
Run Code Online (Sandbox Code Playgroud)
当然,更简洁的方法是使用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'
Run Code Online (Sandbox Code Playgroud)
[感谢@AshwiniChaudhary指出了fillvalue参数izip_longest]
希望这可以帮助