发现网上没几个用python实现这个问题的回答(至少我没找到,可能是我搜索功力不行)。所以我就写出来给大伙瞧瞧,不足之处请多多指教!

题目

一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

要求:
1、使用递归
2、程序输出如下格式:
出发时共赶x只鸭子。
经过第1个村庄卖了y只鸭子,剩余z只鸭。
经过第2个村庄卖了y’只鸭子,剩余z’只鸭。
……
经过第n个村庄卖了Y只鸭子,剩余Z只鸭。

分析

就我个人来看,递归还是比较难用的(像我这种人肯定能不用就不用),不过作业嘛,还是要写的。
据我观察,递归需要两个东西:

  • 终止条件
  • 递归内容

有了上述的概念,我们就来分析题目。利用编程求解这类题的思路都是倒着来,最后剩2只鸭子,那么就卖出去了4只鸭子,那么到第7个村庄时应该还剩下6只鸭子,以此类推,知道了剩下z只鸭子,那么刚到这个村子时就有了 p r e = 2 × ( z + 1 ) pre = 2×(z+1) pre=2×(z+1)只鸭子,卖了 p r e − z pre-z pre−z只鸭子。思路有了,递归终止条件就出来了,也就是当村庄数等于0的时候,终止递归,结束函数。递归的内容就是村庄数-1,再加上用剩下的鸭子数目求得的刚到这个村子所拥有的鸭子数目。

思路逐渐清晰,我们需要定义一个函数,参数为村子数目CunZiShu和剩下的鸭子数目duck_num,在递归的时候剩下的鸭子数目变为刚到这个村子所拥有的鸭子数目pre,递归的终止条件就是
CunZiShu == 0。

最后来解决输出格式的问题。很容易发现,我们的思路是倒着来的,因此得到的关于鸭子的信息也是倒着来的。因此我的想法是,在函数的参数列表中添加缺省值process=’’,来记录每一次递归的信息,每一次递归的信息加到process前面,并且在前头加上换行符\n,在将新的process添加到参数中,就可以解决信息存储问题。最后在终止条件下加上开头那句然后输出process即可。
万事俱备,来写代码吧!

代码

# 参数为村子数, 剩下的鸭子数和记录的信息,默认为空。
def duck(CunZiShu, duck_num, process=''):# 根据剩下的鸭子数目计算刚到这个村时的鸭子数目pre = 2*(duck_num+1)# 终止条件if CunZiShu == 0: process = '出发时共赶{}只鸭子。'.format(duck_num) + process# 打印最后结果print(process)else:# 卖出的鸭子数目sell = pre - duck_num# 记录信息process = '\n经过第{}个村庄卖了{}只鸭子,剩余{}只鸭。'.format(CunZiShu, sell, duck_num) + process# 递归内容(上一个村子,上一个村子剩下的鸭子,记录的信息)return duck(CunZiShu-1, pre, process) duck(7,2)

perfect!来看看运行结果:

出发时共赶510只鸭子。
经过第1个村庄卖了256只鸭子,剩余254只鸭。
经过第2个村庄卖了128只鸭子,剩余126只鸭。
经过第3个村庄卖了64只鸭子,剩余62只鸭。
经过第4个村庄卖了32只鸭子,剩余30只鸭。
经过第5个村庄卖了16只鸭子,剩余14只鸭。
经过第6个村庄卖了8只鸭子,剩余6只鸭。
经过第7个村庄卖了4只鸭子,剩余2只鸭。

这样就获得了结果,代码的复用性也可以,如果改改参数:

duck(8, 3)
出发时共赶1278只鸭子。
经过第1个村庄卖了640只鸭子,剩余638只鸭。
经过第2个村庄卖了320只鸭子,剩余318只鸭。
经过第3个村庄卖了160只鸭子,剩余158只鸭。
经过第4个村庄卖了80只鸭子,剩余78只鸭。
经过第5个村庄卖了40只鸭子,剩余38只鸭。
经过第6个村庄卖了20只鸭子,剩余18只鸭。
经过第7个村庄卖了10只鸭子,剩余8只鸭。
经过第8个村庄卖了5只鸭子,剩余3只鸭。

最后,来一个毫无意义的环节:

def duck(CunZiShu, duck_num, process=''):return duck(CunZiShu-1, 2*(duck_num+1), '\n经过第{}个村庄卖了{}只鸭子,剩余{}只鸭。'.format(CunZiShu, 2*(duck_num+1)-duck_num, duck_num) + process) if CunZiShu!=0 else print('出发时共赶{}只鸭子。'.format(duck_num) + process)

虽然没啥意义但以外地很有趣,不是吗?(或许就我这么觉得吧,这也是我喜欢python的一个地方)
行了,这次就到这里吧。欢迎各位指出我的不足。如果有更好的写法也欢迎讨论噢!
本人QQ:1183057296,欢迎交流。

利用python和递归实现赶鸭子问题相关推荐

  1. 利用python和循环实现赶鸭子问题

    时隔一年,我又来水了.今天忽然有人来问我:你那篇赶鸭子问题的文章用的是递归方法,那能不能用循环来做呢?我的回答是能,但是可能比递归麻烦些. 麻烦些就不做了吗?是的,不做了,本文到此完结,撒花! ❀❀❀ ...

  2. python用渐变色画圆_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

  3. matlab 随机森林算法_(六)如何利用Python从头开始实现随机森林算法

    博客地址:https://blog.csdn.net/CoderPai/article/details/96499505 点击阅读原文,更好的阅读体验 CoderPai 是一个专注于人工智能在量化交易 ...

  4. python控制autocad_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

  5. python利用特征进行可视化样本显示_利用Python进行机器学习之特征选择

    毫无疑问,解决一个问题最重要的是恰当选取特征.甚至创造特征的能力,这叫做特征选取和特征工程.对于特征选取工作,我个人认为分为两个方面: 1)利用python中已有的算法进行特征选取. 2)人为分析各个 ...

  6. python数据分析方法和命令_《利用Python进行数据分析》 —— (1)

    <利用Python进行数据分析> -- (1) Python的学习需要自主探索各种类型,函数和方法的文档. 2.1 Python解释器 在IPython(Jupyter Qtconsole ...

  7. 利用python进行数据分析_利用python进行数据分析复现(1)

    一直以来,都想学习python数据分析相关的知识,总是拖拖拉拉,包括这次这个分享也是.<利用python进行数据分析 第2版>是一次无意之间在简书上看到的一个分享,我决定将很详细.一直都 ...

  8. python函数递归 斐波那契数列

    4.7 python函数递归 斐波那契数列 代码:(利用递归.format输出等) def fibonacci(n):if n==1 or n==2:f=1else:f=fibonacci(n-1)+ ...

  9. autocad支持python吗_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

最新文章

  1. Matlab-实时编辑器介绍
  2. 足球动图gif(一)
  3. 超好用!5款开源的移动自动化测试工具
  4. 2019蓝桥杯国赛B组第九题
  5. typeorm 生成实体类_android常用orm框架greenDAO创建表生成实体类
  6. 《Ext JS权威指南》——2.4节关于Ext.onReady
  7. 2019年10月数据库流行度排行:国产数据库鲲鹏正举 PostgreSQL同比增幅第一
  8. kafaka可视化工具
  9. Atitit 身份证 证件编码规范
  10. 【VOLTE】VOLTE-通话信令流程
  11. 最新蓝屏代码0x0000006b完美解决方案,附文件
  12. TOM邮箱|怎么在邮箱里设置邮件个人签名呢?
  13. element upload 上传文件报错status of undefined
  14. 《如何阅读一本书》读后总结
  15. swiper设置autoplay不起作用
  16. CAD中角度如何平分、CAD特性匹配的作用是什么?
  17. JS 将对象拆开拼接成 URL
  18. excel2010免费下载与安装
  19. Dynamics 365 无需频繁发布来开发和调试Javascript
  20. vue返回首页后如何清空路由

热门文章

  1. oracle数据库报错1033,ORACLE出现错误1033和错误ORA-00600的解决方法
  2. express+socket.io 共享session
  3. 采用α-β算法实现井字棋游戏
  4. Java实现屏幕截屏
  5. mysql按照年龄区间分组查询
  6. 二叉树相关题(Java实现)
  7. 2021-10-30 字典
  8. 网工浓缩笔记以及考点(第四章 无线通信网)
  9. Android 获取经纬度。2018年写
  10. 聊聊我在职场的至暗时刻!