【发布时间】:2021-04-26 09:37:04
【问题描述】:
我有一个清单
s = ["h", "e", "l", "l", "o"]
我尝试使用递归函数原地反转
def reverse_string4(arr, start=0):
while start < len(arr):
arr.insert(start, arr.pop())
reverse_string4(arr, start + 1)
上面进入一个无限循环,但是下面这个可以工作
def reverse_string2(arr, start=0):
if start == len(arr)-1:
pass
else:
arr.insert(start, arr.pop())
reverse_string2(arr, start + 1)
当调试开始变量增加时我很困惑,那么为什么没有终止while循环?
【问题讨论】:
-
while是一个无限循环。循环体中没有任何内容可以使 while 条件为假。为什么你认为你需要一个while循环和递归? -
那么当 start 变为 5 为什么不终止 while 循环?
-
使用
if代替while循环,因为递归中不需要while循环。if start < len(arr):也可以。 -
start不会变成 5。当您递归调用reverse_string2时,您会使用自己的变量和自己的start创建一个新的函数运行。但是在最初的运行中,while 循环正在查看的start变量仍然具有相同的值,因此它仍然循环。 -
tldr:递归调用不是 goto。