我试图在排序列表中找到最大值。但递归并没有停止。拜托,有人可以帮帮我吗?
A = [5,16,28,43,0,1]
start = 0
end = len(A) - 1
mid = 0
print mid
def search(start, end, mid):
mid = int((start + end) / 2)
print mid
if A[mid] > [mid - 1] and A[mid] > A[mid + 1]:
return A[mid]
else:
if A[mid - 1] > A[mid + 1]:
search(start, mid, mid)
else:
search(mid, end, mid)
打印搜索(开始,结束,中)
答案 0 :(得分:2)
您需要添加"基础案例" (递归停止的地方)。
此问题的自然基础案例:如果start
等于end
,则只返回A[start]
编辑:
我只是看着这个,我越看越混乱。为什么使用递归来查找最大值?使用递归来进行二进制搜索会更有意义。在排序列表中查找值。
如果你想真正找到最大值,这很容易。通过递归,我们首先需要一个"基础案例"这给了我们一个简单的解决方案;那么我们需要更多代码,这将使我们更接近该解决方案。
在这种情况下,基本情况:我们在列表中只有一个值;将其作为最大值返回具体而言,如果start
和end
一起只指定一个值,则返回该值。为了使其能够抵御错误,我们还可以处理start
等于或大于end
的情况。
接下来记住第一个值。
接下来进行递归调用,但是向start
添加一个以减少我们正在考虑的列表的大小。这是让我们更接近解决方案的部分。重复此步骤足够多次,我们得出基本情况,列表中只有一个值需要考虑。
最后将记住的第一个值与递归调用的结果进行比较,并返回两个中较大的一个。
我会在你的伪代码中为你安排它:
BASIS CASE: start and end specify one value: return A[start]
save A[0] in a variable
save recursive_call_to_this_function(start+1, end) in a variable
compare two saved values and return the larger
一旦您尝试在代码中编写上述内容,请在此行下方查看我的工作测试解决方案。
def recursive_max(start, end):
if start >= end - 1:
return A[start]
x0 = A[start]
x1 = recursive_max(start+1, end)
if x0 >= x1:
return x0
else:
return x1
print recursive_max(start, end)
答案 1 :(得分:0)
我同意史蒂夫的大部分回答,但我不是一次挑选一个元素,而是建议将列表分成两半并在每一半中找到最大值。您不会进行任何较少的比较,但递归堆栈的增长将为O(log(len(A)))
而不是O(len(A))
。对于大型列表,这将是获得堆栈溢出之间的区别。
我的实现(将列表作为参数而不是期望它是全局的)如下:
def recursive_max(value_list, start, end):
if start >= end:
return value_list[start]
mid = start + (end - start) // 2
lower_half_max = recursive_max(value_list, start, mid)
upper_half_max = recursive_max(value_list, mid+1, end)
if lower_half_max > upper_half_max:
return lower_half_max
else:
return upper_half_max