时隔一年,我又来水了。今天忽然有人来问我:你那篇赶鸭子问题的文章用的是递归方法,那能不能用循环来做呢?我的回答是能,但是可能比递归麻烦些。
麻烦些就不做了吗?是的,不做了,本文到此完结,撒花!
❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀
好了,不玩了,我的兴趣还是被勾上来了。这个事情可能没啥意义,但我还是决定干一干。人生嘛,折腾就完事了。
题目
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
要求:
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
pre−z只鸭子。思路有了,循环的条件和内容就出来了,也就是当村庄数等于0的时候,终止循环,输出结果。循环的内容就是村庄数-1,用剩下的鸭子数目求得的刚到这个村子所拥有的鸭子数目,以及用这些数目代替原来的数目参与下一次循环直至循环结束。
思路逐渐清晰,我们需要定义一个函数,参数为村子数目CunZiShu和剩下的鸭子数目duck_num,在循环的时候剩下的鸭子数目变为刚到这个村子所拥有的鸭子数目pre,循环的条件就是 CunZiShu > 0。
最后来解决输出格式的问题。很容易发现,我们的思路是倒着来的,因此得到的关于鸭子的信息也是倒着来的。因此我的想法是,在函数的参数列表中添加缺省值process=’’,来记录每一次循环的信息,每一次循环的信息加到process前面,并且在前头加上换行符\n,在将新的process添加到参数中,就可以解决信息存储问题。最后在循环结束后加上开头那句然后输出process即可。
万事俱备,来写代码吧!先上一个while循环版本的。
defduck2(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-=1print('出发时共赶{}只鸭子。'.format(duck_num)+ process)
那么while循环都有了,for循环还会远吗?上代码!
defduck3(CunZiShu, duck_num, process=''):for i inrange(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和我交流,大家共同进步!
好,本文正式收尾,撒花!❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀
版权归原作者 Cao.newbie 所有, 如有侵权,请联系我们删除。