递归,找到最大,为什么不停止?

时间:2015-01-06 23:04:38

标签: python recursion

我试图在排序列表中找到最大值。但递归并没有停止。拜托,有人可以帮帮我吗?

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)

打印搜索(开始,结束,中)

2 个答案:

答案 0 :(得分:2)

您需要添加"基础案例" (递归停止的地方)。

此问题的自然基础案例:如果start等于end,则只返回A[start]

编辑:

我只是看着这个,我越看越混乱。为什么使用递归来查找最大值?使用递归来进行二进制搜索会更有意义。在排序列表中查找值。

如果你想真正找到最大值,这很容易。通过递归,我们首先需要一个"基础案例"这给了我们一个简单的解决方案;那么我们需要更多代码,这将使我们更接近该解决方案。

在这种情况下,基本情况:我们在列表中只有一个值;将其作为最大值返回具体而言,如果startend一起只指定一个值,则返回该值。为了使其能够抵御错误,我们还可以处理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