我正在研究递归算法,需要一些帮助,所以我来到这里做了一些挖掘。我发现的东西适用于我想要它做的事情(链接:仅使用递归的python minmax),但我不明白它为什么以及如何工作。这是代码:
def minMax(A,n):
if A:
header = A[0]
tailend = A[1:]
if tailend != []:
minimum, maximum = minMax(tailend,n-1)
return [header, minimum][minimum < header], [header, maximum][maximum > header]
return header, header
return A
intlist = [30, 50, 20, 70, 10, 80, 25, 100, 60, 40]
print(minMax(intlist,len(intlist)))
我不明白的是这块:返回[标题,最小][最小<标题],[标题,最大值][最大值>标题]括号如何工作?据我所知,括号用于切片、列表、索引和排序。但在这里,似乎有某种关键字从幕后进行,我只是想不通。任何帮助将不胜感激。
您有一个下标[]
的列表[1,2,3][0]
如果运行minimun < header
并且minumun
和header
都已明确定义,则输出将是布尔True
或False
。
现在,在 Python 中:
0=False
1=True
事情就是这样。
因此,您将获得列表中的元素 0 或 1。
正如@csjh所指出的,您的"返回"会将一系列由逗号分隔且没有进一步规范的值解释为元组。
因此,您获得每个列表的元素 0 或 1,并且您以len
2 的元组形式获取该信息:
(element_1,element_2)
不是解释,而是将其编写为单行代码的一种更 Python(但仍然迟钝)的方法是:
return header if minimum > header else minimum, header if maximum < header else maximum
它使用 Python 的三元 if-else 表达式的变体。
为了更明确,你可以简单地写
if minimum > header:
a = header
else:
a = minimum
if maximum < header:
b = header
else:
b = maximum
return (a, b)
或使用三元表达式:
a = header if minimum > header else minimum
b = header if maximum < header else maximum
return (a, b)
在我看来,这使代码保持合理简短,同时仍然比原始代码清晰得多。
当然,以上都是错误的,但可能更接近原始陈述。这是你(真的)应该做的:
return min(minimum, header), max(maximum, header)
它显示了实际意图,并且比任何其他编写方式都短得多。(它可能忽略了练习的实际目的,所以有点断章取义。
[minimum < header]
是列表的索引。由于索引应该是整数,因此[minimum < header]
被强制为整数。False
去0
,True
去1
.因此,如果minimum
小于header
,则返回minimum
,因为它是索引1
处的元素。否则,header
将返回。这是一种获得min([header, minimum])
的奇特方式。我不确定写这篇文章的人只是在炫耀还是忘记了min
.