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

时隔一年,我又来水了。今天忽然有人来问我:你那篇赶鸭子问题的文章用的是递归方法,那能不能用循环来做呢?我的回答是能,但是可能比递归麻烦些。
麻烦些就不做了吗?是的,不做了,本文到此完结,撒花!
❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀
好了,不玩了,我的兴趣还是被勾上来了。这个事情可能没啥意义,但我还是决定干一干。人生嘛,折腾就完事了。

题目

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

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

大体的思路我觉得应该跟递归差不多,数学关系上的问题应该是一样的。这里我就不多赘述了。初次观看文章的同志可以去看我上一篇文章:
利用python和递归实现赶鸭子问题

分析

让我们来好好看看这道题。我们知道了信息有最后剩下了多少只鸭子,经过了几个村子,以及怎样一次次卖掉鸭子,让我们求出发时赶了几只鸭,以及每个村子卖了几只鸭。因此,我们的思路就是倒推。(以下分析改自前一篇文章,既视感很强啥的就别在意了)
最后剩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 prez只鸭子。思路有了,循环的条件和内容就出来了,也就是当村庄数等于0的时候,终止循环,输出结果。循环的内容就是村庄数-1,用剩下的鸭子数目求得的刚到这个村子所拥有的鸭子数目,以及用这些数目代替原来的数目参与下一次循环直至循环结束。

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

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

def duck2(CunZiShu, duck_num, process=''):
    while CunZiShu>0:
        pre = 2*(duck_num+1)
        sell = pre - duck_num
        process = '\n经过第{}个村庄卖了{}只鸭子,剩余{}只鸭。'.format(CunZiShu, sell, duck_num)+process
        # 记得更新鸭子的数目
        duck_num = pre
        CunZiShu-=1
    print('出发时共赶{}只鸭子。'.format(duck_num) + process)

那么while循环都有了,for循环还会远吗?上代码!

def duck3(CunZiShu, duck_num, process=''):
    for i in range(CunZiShu,0,-1):
        pre = 2*(duck_num+1)
        sell = pre - duck_num
        process = '\n经过第{}个村庄卖了{}只鸭子,剩余{}只鸭。'.format(i, sell, duck_num)+process
        duck_num = pre
    print('出发时共赶{}只鸭子。'.format(duck_num) + process)

两种循环都不难理解,某种程度上甚至比递归的方法还好理解。我就不多废话了。
如果有什么疑问可以加我QQ1183057296和我交流,大家共同进步!
好,本文正式收尾,撒花!❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值