python - python minmax 仅使用递归
问题描述
我正在尝试构建一个函数,该函数接受一个列表并返回一个 (min, max) 的元组。
例如,
[2,1,4,9,4.5]
会回来
(1, 9)
我正在尝试仅使用递归并希望执行此任务而不使用其他使这变得非常容易的东西(例如 min()、max()、sort()、sorted()、loop..等)
到目前为止,我已经能够创建找到最大值的函数
def findmax(alist):
if len(alist) <= 1:
return tuple(alist)
elif len(alist) == 2:
if alist[0] >= alist[1]:
return findmax([alist[0]])
elif alist[0] <= alist[1]:
return findmax([alist[1]])
elif len(alist) > 2:
if alist[0] >= alist[1]:
return findmax([alist[0]] + alist[2:])
elif alist[0] <= alist[1]:
return findmax(alist[1:])
哪个
findmax([2,1,4,9,4.5])
返回
(9,)
和一个找到最小值的函数(差别不大)
def findmin(alist):
if len(alist) <= 1:
return tuple(alist)
elif len(alist) == 2:
if alist[0] >= alist[1]:
return findmin([alist[1]])
elif alist[0] <= alist[1]:
return findmin([alist[0]])
elif len(alist) > 2:
if alist[0] >= alist[1]:
return findmin(alist[1:])
elif alist[0] <= alist[1]:
return findmin([alist[0]] + alist[2:])
哪个
findmin([2,1,4,9,4.5])
返回
(1,)
有没有办法仅使用递归将这两个单独的函数合二为一,以便返回所需的结果
(1, 9)
任何帮助将不胜感激。
解决方案
我发现这类问题往往比你想象的要简单。让递归完成工作:
def find_min_max(a_list):
if a_list:
head, *tail = a_list
if tail:
minimum, maximum = find_min_max(tail)
return [head, minimum][minimum < head], [head, maximum][maximum > head]
return head, head
return a_list
用法
>>> find_min_max([2, 1, 4, 9, 4.5])
(1, 9)
>>> find_min_max('elephant')
('a', 't')
>>>
此解决方案特定于 Python 3,但可以轻松修改以兼容 Python 2 和 3。
推荐阅读
- spring-boot - 在 Spring Boot JMS 中更改 ActiveMQ 代理 JMX 端口 1099
- azure-devops - 如何自定义 Azure Board 中的标记颜色?
- ios - 以远程服务器为目标时,Cordova iOS 崩溃
- ios - OpenGL ES 在 iOS 12 和 SKShader 中已弃用
- java - Android:Firebase Cloud Messaging 未发送通知以构建 .apk
- angular - 高图表中大负值和小正值的 Y 轴
- javascript - Rails:javascript addEventListener 找不到动态形式的元素
- c# - 洗牌竞争对手名单,每个月都有不同的竞争对手
- java - 如何在 Java 中生成有效的 EAN13 条形码?
- blueprism - Blue Prism 应用程序建模器无法识别 Firefox 上的身份验证弹出窗口