使用递归连接两个字符串
Using recursion to concatenate two strings
我的目标是使用递归连接两个字符串。
输入为 str1 = ("long string") str2 = ("yes so long")
输出为:'lyoensg ssto rlionngg'
假设两个字符串的长度相同。
我现在的代码是:
def concat_order(str1, str2):
if len(str1) == 0:
return 'complete'
i = 0
new_str = str1[i] + str2[i]
i = i + 1
return concat_order(str1[1:], str2[1:])
return new_str
print(concat_order("long string"', "yes so long"))
我确定我离得很近,但我正在努力让它循环。
我不能使用循环,但我可以使用 if 语句
递归只需要一个基本案例和一个递归案例。在这里,您的基本情况有点奇怪。你永远不需要字符串 "complete"
所以你不应该 return 那个。 str1
为空时的基本情况应该只是 return 空字符串。
然后你只需要从每个字符串中取出第一个字母,concat,然后用递归的方式连接剩下的:
def concat_order(str1, str2):
if len(str1) == 0:
return ''
a, b = str1[0], str2[0]
return a + b + concat_order(str1[1:], str2[1:])
concat_order("long string", "yes so long")
# 'lyoensg ssot rlionngg'
请注意额外的 space 是正确的行为,除非需要阻止它们。
def concat_strings_rec(str1, str2):
if len(str1) < 1:
return ""
else:
curStr = str1[0] + str2[0]
return curStr + concat_strings_rec(str1[1:], str2[1:])
def concat_string_iter(str1, str2):
return "".join([str1[i] + str2[i] for i in range(len(str1))])
string1 = "long string"
string2 = "yes so long"
print(concat_strings_rec(string1, string2))
print(concat_string_iter(string1, string2))
预期输出:
lyoensg ssot rlionngg
lyoensg ssot rlionngg
递归求解
您需要数组长度为 0 的基本情况。在这种情况下 return 一个空字符串。在所有其他情况下 return 每个字符串的第一个元素与递归调用 concat_strings_rec()
的 return 值连接。请记住减小递归调用的数组大小!
迭代求解
迭代解决方案只是遍历数组,连接两个字符串中的每个字符,并将连接的第一个、第二个、第三个……字符放入一个数组中。然后使用"".join()
将数组中的这两个字符串拼接成一个完整的字符串。
推荐
不要使用递归解决方案,因为它只会因调用堆栈而消耗更多内存,而且速度会变慢,而且由于 Python 对调用堆栈上的调用次数有限制,因此它会失败对于更大的字符串。
您不需要像这样传递 'i':new_str = str1[i] + str2[i]
因为您已经 returning 字符串不包括前一个字符:return concat_order(str1[1:], str2[1:])
.
另外一个函数不能有两个这样的return语句:
return concat_order(str1[1:], str2[1:])
return new_str
return 语句之后的任何语句都不会执行。这就是为什么我们在一些条件语句中写多个 return 语句,比如 if else
已修改您的程序以给出正确答案。
def concat_order(str1, str2, new_str):
if len(str1) == 0:
return new_str
new_str += str1[0] + str2[0]
return concat_order(str1[1:], str2[1:], new_str)
ans = ""
print(concat_order("long string", "yes so long", ans))
或者您可以这样做:
def concat_order(str1, str2):
if len(str1) == 0:
return ''
return str1[0] + str2[0] + concat_order(str1[1:], str2[1:])
print(concat_order("long string", "yes so long"))
当控制流达到基本情况时,我们已经有了我们想要的,所以不要 return 任何东西。
我的目标是使用递归连接两个字符串。
输入为 str1 = ("long string") str2 = ("yes so long")
输出为:'lyoensg ssto rlionngg'
假设两个字符串的长度相同。
我现在的代码是:
def concat_order(str1, str2):
if len(str1) == 0:
return 'complete'
i = 0
new_str = str1[i] + str2[i]
i = i + 1
return concat_order(str1[1:], str2[1:])
return new_str
print(concat_order("long string"', "yes so long"))
我确定我离得很近,但我正在努力让它循环。
我不能使用循环,但我可以使用 if 语句
递归只需要一个基本案例和一个递归案例。在这里,您的基本情况有点奇怪。你永远不需要字符串 "complete"
所以你不应该 return 那个。 str1
为空时的基本情况应该只是 return 空字符串。
然后你只需要从每个字符串中取出第一个字母,concat,然后用递归的方式连接剩下的:
def concat_order(str1, str2):
if len(str1) == 0:
return ''
a, b = str1[0], str2[0]
return a + b + concat_order(str1[1:], str2[1:])
concat_order("long string", "yes so long")
# 'lyoensg ssot rlionngg'
请注意额外的 space 是正确的行为,除非需要阻止它们。
def concat_strings_rec(str1, str2):
if len(str1) < 1:
return ""
else:
curStr = str1[0] + str2[0]
return curStr + concat_strings_rec(str1[1:], str2[1:])
def concat_string_iter(str1, str2):
return "".join([str1[i] + str2[i] for i in range(len(str1))])
string1 = "long string"
string2 = "yes so long"
print(concat_strings_rec(string1, string2))
print(concat_string_iter(string1, string2))
预期输出:
lyoensg ssot rlionngg
lyoensg ssot rlionngg
递归求解
您需要数组长度为 0 的基本情况。在这种情况下 return 一个空字符串。在所有其他情况下 return 每个字符串的第一个元素与递归调用 concat_strings_rec()
的 return 值连接。请记住减小递归调用的数组大小!
迭代求解
迭代解决方案只是遍历数组,连接两个字符串中的每个字符,并将连接的第一个、第二个、第三个……字符放入一个数组中。然后使用"".join()
将数组中的这两个字符串拼接成一个完整的字符串。
推荐
不要使用递归解决方案,因为它只会因调用堆栈而消耗更多内存,而且速度会变慢,而且由于 Python 对调用堆栈上的调用次数有限制,因此它会失败对于更大的字符串。
您不需要像这样传递 'i':new_str = str1[i] + str2[i]
因为您已经 returning 字符串不包括前一个字符:return concat_order(str1[1:], str2[1:])
.
另外一个函数不能有两个这样的return语句:
return concat_order(str1[1:], str2[1:])
return new_str
return 语句之后的任何语句都不会执行。这就是为什么我们在一些条件语句中写多个 return 语句,比如 if else
已修改您的程序以给出正确答案。
def concat_order(str1, str2, new_str):
if len(str1) == 0:
return new_str
new_str += str1[0] + str2[0]
return concat_order(str1[1:], str2[1:], new_str)
ans = ""
print(concat_order("long string", "yes so long", ans))
或者您可以这样做:
def concat_order(str1, str2):
if len(str1) == 0:
return ''
return str1[0] + str2[0] + concat_order(str1[1:], str2[1:])
print(concat_order("long string", "yes so long"))
当控制流达到基本情况时,我们已经有了我们想要的,所以不要 return 任何东西。