Python求解N个人N份外卖全部拿错的可能数量

董付国老师Python系列教材推荐与选用参考

开学第一课:一定不要这样问老师Python问题

3000道Python习题免费在线练习

“Python小屋”1300篇历史文章分类速查表

董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材1:董付国编著,《Python数据分析、挖掘与可视化 (慕课版 第2版)》,ISBN:978-7-115-62634-9,定价59.8元,2024年1月出版(第1版累计印刷11次,已退出历史舞台),配套慕课“Python数据分析与数据可视化”被评为智慧树精品课程,人民邮电出版社“优秀作译者”

84a3bbb40d0d907e571a2c97720cc3e1.png

图书内容: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

b8a74c7a620349f1058270754440c352.jpeg

=============

问题描述:

n个人点外卖,外卖员放在小区门口大家自己去拿,n个人全部拿错的可能有多少种?

首先导入后面用到的标准库对象,

338a74696807b5f0c8473a1f042d9093.png

对于这个问题,比较直接的思路是得到全排列,然后统计其中符合条件的排列数量,这个方法在n变大时性能会急剧下降。

a20320e594c4380caf07906a8ecb9431.png

作为上面算法的改进,可以使用回溯法按深度优先遍历生成全排列,如果在生成排列的过程中发现明显不符合条件则立即停止。但如果符合要求的排列数量较大,函数递归调用的额外开销比剪枝消除的开销大时,整体性能并不会提高。在上面的问题中,符合条件的排列数量约为全排列的37%,属于比较多的情况。

a01ad67fba41e38b4cf375a064bcf74c.png

这个问题也可以使用递推算法或递归算法来求解,关键是得到递推公式。只有一份外卖时拿错的可能为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))。

5914ff420656d60f557b1ff6554c3a70.png

如果使用递归算法求解时,函数递归调用会引入额外开销,并且f(n-1)和f(n-2)存在重复计算,可以使用标准库函数functools.lru_cache()提供的缓冲区减少重复计算。

2e1224cfd30d64eda7834c2fcd52762b.png

最后编写代码测试几种方法的性能。

2f2f51022b44055a966305d0800e6d62.png

运行结果:

60a956e69faf777695af6fac020cec5a.png

=================

温馨提示:

关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和760道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值