==============
版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。
=============
推荐教材1:董付国编著,《Python数据分析、挖掘与可视化 (慕课版 第2版)》,ISBN:978-7-115-62634-9,定价59.8元,2024年1月出版(第1版累计印刷11次,已退出历史舞台),配套慕课“Python数据分析与数据可视化”被评为智慧树精品课程,人民邮电出版社“优秀作译者”
图书内容:Python快速入门,NumPy数组与矩阵运算,Pandas数据分析实战,sklearn机器学习实战,Matplotlib数据可视化实战
配套慕课:智慧树网搜索“董付国”,书中二维码也可以看微课
页数:254
适用专业:计算机、数据科学、统计、管理
适用层次:研究生/本科/专科
适用学时:48/64
样书申请:https://www.ryjiaoyu.com/book/details/50017
================
推荐教材2:董付国著,《Python程序设计与数据采集(微课版)》,ISBN:978-7-115-61183-3,人民邮电出版社,2023年5月出版,2023年9月第2次印刷,定价59.8元
配套资源:教学大纲、电子教案、课件、源码、数据文件、章节习题及答案、25小时微课、在线练习与考试系统
样书申请:https://www.ryjiaoyu.com/book/details/45732
=============
问题描述:
n个人点外卖,外卖员放在小区门口大家自己去拿,n个人全部拿错的可能有多少种?
首先导入后面用到的标准库对象,
对于这个问题,比较直接的思路是得到全排列,然后统计其中符合条件的排列数量,这个方法在n变大时性能会急剧下降。
作为上面算法的改进,可以使用回溯法按深度优先遍历生成全排列,如果在生成排列的过程中发现明显不符合条件则立即停止。但如果符合要求的排列数量较大,函数递归调用的额外开销比剪枝消除的开销大时,整体性能并不会提高。在上面的问题中,符合条件的排列数量约为全排列的37%,属于比较多的情况。
这个问题也可以使用递推算法或递归算法来求解,关键是得到递推公式。只有一份外卖时拿错的可能为0,即f(1)=0。两份外卖时拿错的可能为1种,即f(2)=1。n>2时,假设第1份外卖被第i(i!=1)个人拿走,如果第i份外卖恰好被第1个人拿走则剩余问题变为n-2错排问题,如果第i份外卖没有被第1个人拿走则剩余问题变为n-1错排问题。i的取值有n-1种可能,所以f(n)=(n-1)(f(n-1)+f(n-2))。
如果使用递归算法求解时,函数递归调用会引入额外开销,并且f(n-1)和f(n-2)存在重复计算,可以使用标准库函数functools.lru_cache()提供的缓冲区减少重复计算。
最后编写代码测试几种方法的性能。
运行结果:
=================
温馨提示:
关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和760道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。