有5只猴子上山去摘桃,一直摘到天黑。5只猴子把所有的桃子放在一起,然后约定第二天一早来分桃。

第二天早晨,来了一只猴子。他等了一会后心想:不如干脆我把桃子分了吧。于是他把桃子分成了五等份,分完后发现多了一只桃子。他想:我这么辛苦把桃子分了,这多出的一只桃子理应归我!于是他吃了这只桃子,然后带上一等份桃子,走了!

过了一会,第二只猴子来了。他也等了一会。不耐烦之后也把桃子分成了五等份,也发现多一只桃子。他同样吃了那桃子之后也带走了一等份桃子。

后来,第三、第四、第五只猴子都是先五等分桃子,然后吃掉多出来的一个桃,最后再带走一等份桃子。

问最初一共有多少只桃子?

这个问题其实是有数学解的,但是数学解很难想到。现在我们编写一个Python程序,在不依赖数学解的情况下解决这个问题。这个问题乍一看似乎有不小难度,但是如果按照自顶向下的程序设计方法,这个问题也不难解决。

首先从总体上考虑这个问题。既然不知道桃子有多少个,那就从1个桃子开始考虑。如果这一个桃子能够被5只猴子这样分掉,那么桃子的总数就是1个。如果不能,那就把桃子的数目加1,变成2。然后再看这2个桃子是否能被5只分掉。如果能则桃子总数就是2,否则就把桃子的数目再加1,……,以此类推直到找到第一个能被5只分的数为止。所以,主程序是这样的:

五猴分桃问题的主程序

def monkey_peach():  # 五猴分桃问题主算法:p = 1   # 1) 变量p = 1while not dividable(p):    # 2) 循环,如果p不能被5只分掉,则执行:p += 1    #     2.1) p=p+1#     2.2) 转2)print(p)    # 3) 打印pmonkey_peach()  # 执行五猴分桃算法

其中的dividable(p)表示判断p个桃子能否被5只猴子分掉。这里应该直接调用它然后再实现它。但是很多程序员包括有多年程序设计经验的高级软件工程师却习惯先实现被调用的子函数再在主程序中调用它。这个习惯不好,很容易把思维局限在局部模块中,而看不见整体。有时,同一个需求可以用不同的算法,不同的数据结构,不同的程序设计模式实现,如果不清楚调用端的环境,就只能盲目选择一个进行实现,所编写出来的子程序有可能最后才发现不适合调用端的需求。

正确的做法应该是先整体后局部,自顶向下地编程。不要小看这一点差别,它是一个程序员是否成熟的标志。

下面考虑dividable(p)的实现,很自然地,我们把p个桃子依次让5只猴子分。如果这个循环能够正常结束,这就说明这p个桃子的确能被5只猴子分掉,返回True;如果某只猴子无法把桃子分掉,则立即终止循环并返回False。

如何判断p个桃子能否被一只猴子分掉呢?首先,猴子要吃掉一个桃子,所以p要减去1,然后看剩下的桃子数(即p - 1)能否被5整除。如果能,则剩下4(p-1)/5个桃子;如果不能,则意味着p个桃子不能被当前的猴子分掉。代码如下:

五猴分桃问题的完整解

def dividable(p):            # 五猴分桃问题子算法(p个桃子能否被5只猴子分掉):for _ in range(5):        # 1) 循环5次,每次执行:p -= 1                #     1.1) p = p – 1   #注释:吃掉一个桃子if p % 5 == 0:       #     1.2) 如果p能被5整除,则:p = p // 5 * 4 #           p = 4/5 * pelse:               #     1.3) 否则:return False    #           程序结束,返回“假”return True               # 2) 程序成功,返回“真”def monkey_peach():   # 主函数p = 1 while not dividable(p):     p += 1    print(p)    monkey_peach()  # 调用五猴分桃函数

Python解决五猴分桃问题相关推荐

  1. 五猴分桃通解公式-敬献给诺贝尔奖获得者李政道博士

    摘要:"五猴分桃问题"是一个中.外非常有名的趣味数学难题.研究这种类型题的简易计算方法曾困扰住了一些大物理学家和数学家.李政道博士在中国科技大学讲学时也特意提到此题, 本文通过对该 ...

  2. python猴子分桃问题_用python实现【五猴分桃】问题

    转载链接:https://blog.csdn.net/cy309173854/article/details/78296839 据说"五猴分桃"问题最先是由大物理学家狄拉克提出来的 ...

  3. python猴子分桃_用python实现【五猴分桃】问题

    转载链接:https://blog.csdn.net/cy309173854/article/details/78296839 据说"五猴分桃"问题最先是由大物理学家狄拉克提出来的 ...

  4. python猴子分桃_Python 五猴分桃.py问题解答代码

    时间:2019-01-09 概述:五猴分桃 海滩上有一堆桃子,n只猴子来分.第一只猴子把这堆桃子凭据分为n份,多了一个,这只猴子把多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均分成n份,又 ...

  5. 五猴分桃c语言课程设计,c语言程序设计五猴分桃问题实验报告.doc

    c语言程序设计五猴分桃问题实验报告.doc 课程设计报告学院.系:吉林大学珠海学院计算机科学与技术系专业名称:软件工程课程设计科目C语言程序课程设计所在班级:10班学生学号:04121010学生姓名: ...

  6. c语言五猴分桃案例分析,C语言程序设计五猴分桃问题实验报告.doc

    C语言程序设计五猴分桃问题实验报告 课 程 设 计 报 告 学院.系:吉林大学珠海学院计算机科学与技术系专业名称:软件工程课程设计科目C语言程序课程设计所在班级:10班学生学号:学生姓名:赵学文指导教 ...

  7. JAVA语言五猴分桃简单解法_五猴分桃问题新解及其联想

    了,它不知道有1个同伴已经来过,还以为自己第1个到的呢,于是将地上的桃子堆起来,平均分成5份,发现也多了1个,同样吃了这1个,拿走其中的1堆.第3只.第4只.第5只猴子都是这样--问这5只猴子至少摘了 ...

  8. 枚举算法3——五猴分桃

    五猴分桃:五只猴子一起摘了一堆桃子,因为太累了决定先睡一觉再分.一会其中一个猴子先过来将桃子分成五分,剩了一个桃子就给吃了,并拿走其中一份. 一会第2只猴子过来.又将剩下的桃子分成5份,发现多了一个桃 ...

  9. 五猴分桃问题的数学解

    上篇博客(https://fanglin.blog.csdn.net/article/details/119173258)中谈到了五猴分桃问题: 有5只猴子上山去摘桃,一直摘到天黑.5只猴子把所有的桃 ...

最新文章

  1. yanf4j引入了客户端非阻塞API
  2. php 字符串替换 正则表达式,PHP中一些可以替代正则表达式函数的字符串操作函数...
  3. python老鼠打洞问题_脑筋急转弯:老鼠为什么要打洞?这答案让人哭笑不得
  4. 三篇文章了解 TiDB 技术内幕——说存储
  5. 【人工智能实战2019-何峥】第1次作业
  6. 【06】sass编译工具(弃)
  7. 财富信息不需要传userID后台会根据保存的session提供数据
  8. ArcSDE的版本管理机制
  9. JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?...
  10. switch case 解决字符串选择的问题
  11. 20面向对象三特征 之继承 方法重写 super
  12. 关于FileAttributes
  13. 谷歌招聘新职员的五大标准
  14. mysql主从同步搭建过程_mysql 主从复制搭建详细步骤
  15. cmpp java代码_cmpp.java 源代码在线查看 - cmpp的开发的短信端口实例 资源下载 虫虫电子下载站...
  16. Java中通过流下载文件
  17. 做一个微信欢乐斗地主之残局解答器!
  18. html5课件动画制作,ppt如何制作课件动画
  19. 选择合理的WCDMA网络无线扩容方案(转)
  20. 数据版吐槽大会: 国产综艺节目年终盘点

热门文章

  1. 微软文件共享服务器进程,Windows Server“8”– 将服务器应用程序存储转移到 Windows 文件共享...
  2. 微软流媒体服务器直播,流媒体服务器Flussonic Media Server对直播流进行录制
  3. telegram 语音通话语音呼叫一直连接中
  4. win10 登录后无法进桌面且黑屏能打开任务管理器的解决方法
  5. 【微信小程序】rpx
  6. git pull时遇到的问题
  7. 谷歌AI人工智能:我们的原则
  8. android2.2 模拟器,网易MuMu模拟器2.2.29官方版
  9. 电脑浏览器主页面被恶意劫持无法修改的解决方法
  10. ACCV 2020国际细粒度网络图像识别竞赛——正式开赛!