以下是我编写的简单测试代码
我希望通过递归来实现
我学习算法,学习递归。
非常感谢!
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))
答案 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)
我会写max
和max_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([])
一个值。我重复上面的论点。对于任何给定的n
,maximum([n]) = greatest(n, maximum([])) = n
。这意味着,对于每个n
,maximum([]) <= 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)
max
和list
是built-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