为什么要递归?
这可以正常工作,并且比最好的递归算法快 10 倍:
def minMax(array): return min(array),max(array)
为避免每个递归调用自身两次,您可以这样编写函数:
def minMax(array):
first,*rest = array # first,rest = array[0],array[1:]
if not rest : return first,first
subMin,subMax = minMax(rest)
return min(first,subMin), max(first,subMax)
如果您想避免最大递归限制(即在大列表上),您可以使用二进制方法将数组拆分为左右部分。这只会使用 log(n) 级别的递归(并且还会减少一些处理开销):
def minMax(array):
size = len(array)
if size == 1 : return array[0],array[0]
midPoint = size // 2
leftMin,leftMax = minMax(array[:midPoint])
rightMin,rightMax = minMax(array[midPoint:])
return min(leftMin,rightMin), max(leftMin,rightMin)
如果你想减少数组创建和函数调用的开销,你可以传递索引并避免 min()、max() 和 len()(但是你使用递归作为 for 循环,这很漂亮大大违背了目的):
def minMax(array, index=None):
index = (index or len(array)) - 1
item = array[index]
if index == 0 : return item,item
subMin,subMax = minMax(array,index)
if item < subMin: return item,subMax
if item > subMax: return subMin,item
return subMin,subMax
您可以将前两者结合起来以减少开销并避免递归限制,但它会损失一些性能:
def minMax(array, start=0, end=None):
if end is None : end = len(array)-1
if start >= end - 1:
left,right = array[start],array[end]
return (left,right) if left < right else (right,left)
middle = (start + end) >> 1
leftMin,leftMax = minMax(array, start,middle)
rightMin,rightMax = minMax(array, middle+1,end)
return ( leftMin if leftMin < rightMin else rightMin ), \
( leftMax if leftMax > rightMax else rightMax )