如何使用递归实现"查找数组中的最大值"在Python?

时间:2018-04-22 07:06:24

标签: python arrays algorithm recursion

如何使用递归实现"查找数组中的最大值"在Python?

以下是我编写的简单测试代码

我希望通过递归来实现

我学习算法,学习递归。

非常感谢!

def max(list):
    if list == []:
        msg = "List: ..."    
        return msg

    max = list[0]
    for item in list[1:]:
        if item > max:
            max = item
    return max

data = [8,2,-690,4,12,-320,0, 98]
print(max(data))

5 个答案:

答案 0 :(得分:0)

尝试这个(使用递归,根据OP的要求):

def largest(arr):
    if len(arr) == 2:
        return arr[1] if arr[1] > arr[0] else arr[0]
    else:
        return largest([arr[0], largest(arr[1:])])

没有使用内置函数(例如max),因为OP声明他们不希望使用任何内置函数。

函数else的{​​{1}}部分是return的第一个元素或列表中的最大数字(不包括第一个元素),具体取决于较大的数字。

每次执行list部分时,else位在没有第一个元素的情况下检查largest(arr[1:])内最大的数字。这意味着,arr在某一点上将包含两个元素。当它这样做时,使用单行arr语句来比较两个元素,if是更大的元素。

最终,代码会递归到第一级,return是最大的元素。

答案 1 :(得分:0)

我会写maxmax_all

from math import inf

def max (a, b):
  if a > b:
    return a
  else:
    return b

def max_all (x = -inf, *xs):
  if not xs:
    return x
  else:
    return max (x, max_all (*xs))
可以使用任意数量的参数调用

max_all

print (max_all (8, 2, -690, 4, 12, -320, 0, 98))
# 98

或使用*unpack arguments

data = [ 8, 2, -690, 4, 12, -320, 0, 98 ]

print (max_all (*data))
# 98

当给出0输入时它甚至可以工作

print (max_all ())
# -inf

答案 2 :(得分:0)

如果您想使用递归,那么仔细定义最终案例非常重要。

列表中元素的最大值显然是列表其余部分的第一个元素或最大值:它是两个值中最大的一个。这实际上是你要寻找的递归。

但是当没有第一个元素时会发生什么?您有一个空列表和一个未定义的行为。为什么不maximum([]) = 0?因为它会导致一些不一致:maximum([-1]) = greatest(-1, maximum([])) = greatest(-1, 0) = 0。 (您也可以尝试maximum([]) == -math.inf,但这不会非常直观!)

如果列表的其余部分为空,该怎么办?没问题,你只有一个元素,它是最大值。

只需将此分析转换为代码:

def maximum(xs):
    if len(xs) == 0:
        raise ValueError()
    elif len(xs) == 1:
        return xs[0]
    else:
        u = xs[0]
        v = maximum(xs[1:])
        return u if u >= v else v # greatest(u, v)

更多关于maximum([])

我会尝试给maximum([])一个值。我重复上面的论点。对于任何给定的nmaximum([n]) = greatest(n, maximum([])) = n。这意味着,对于每个nmaximum([]) <= n。满足此条件的唯一值是-math.inf。为什么不定义maximum([]) == -math.inf?想象一下,您创建了一个minimum函数。出于对称原因,您必须定义minimum([]) == math.inf。因此,它存在l0 = []列表minimum(l0) > maximum(l0)。没有人会接受这种可能性。

我们现在该怎么办?主要有两种可能性:防御性编程或使用合同。在防御性编程中,函数将检查它收到的参数,如果其中一个参数不正确,则会失败。这就是我所做的:

def maximum(xs):
    if len(xs) == 0:
           raise ValueError()
    ...

如果您使用合同,您基本上会说:如果您将此函数设为空列表,则行为未定义。它可能会返回任何值,崩溃,永远循环,....在这里,你会有类似的东西:

def maximum(xs):
    """!!! xs must not be empty !!!"""
    ...

看起来一样,但存在巨大差异。您可以使用作为实现原因-math.inf作为maximum([])的返回值,因为现在很清楚它没有任何意义。试图检查minimum(l0) <= maximum(l0) l0 = [] def maximum(xs): """PRECONDITION: xs must not be empty""" assert len(xs) != 0 # can be disabled at runtime at your own risks _maximum(xs) def _maximum(xs): """no precondition here""" if len(xs) == 0: return -math.inf else: u = xs[0] v = _maximum(xs[1:]) return u if u >= v else v # greatest(u, v) 是否明显违反合同并且不会对结果感到惊讶的人。当然,如果你想让它变得健壮,你会写:

<form [formGroup]="form" (ngSubmit)="onSubmit()">
        <div class="form-group">
            <label>File:</label>
            <input #theFile type="file" (change)="onFileChange($event)" accept=".png" class="form-control" 
                    formControlName="content" />
            <input type="hidden" name="fileHidden" formControlName="imageInput"/>

                    <!-- [(ngModel)]="model.content" -->

            <div class="alert alert-danger" *ngIf="!form.prestine && form.controls.content.errors?.noFile">
                Please provide a photo.
            </div>
            <div class="alert alert-danger" *ngIf="form.controls.content.errors?.fileTooBig">
                The file is too big and won't uploaded. Maximum allowed size is 500kb.
            </div>
        </div>
        <div class="form-group">
            <label>Notes</label>
            <textarea type="text" class="form-control" formControlName="notes" [(ngModel)]="model.notes" > </textarea>
        </div>
        <button type="submit" class="btn btn-primary" [disabled]="!form.valid">Submit</button>
        <button class="btn btn-default" type="button" (click)="close(false);">Cancel</button>
    </form>

答案 3 :(得分:-1)

maxlistbuilt-in functions。所以你想避免自己使用这些标识符。

这是一个使用递归的简单版本:

#/usr/bin/python

def largest(arr):
    if not arr:
        return None
    else:
        r = largest(arr[1:])
        if r > arr[0]:
            return r
        else:
            return arr[0]

data = [8, 2, -690, 4, 12, -320, 0, 98]
print(largest(data))

答案 4 :(得分:-1)

def Maximum(list):
    if len(list) == 1:
        return list[0]
    else:
        m = Maximum(list[1:])
         if m > list[0] else list[0]:
              return m
def main():
    list = eval(raw_input(" please enter a list of numbers: "))
    print("the largest number is: ", Maximum(list))
main()

The simplest way