猴子吃香蕉的问题-摘自Linux shell核心编程指南

某山顶上有一颗香蕉树,一只猴子第一天从树上摘了若干根香蕉,当即就吃了一半,还不过瘾,又多吃了一根。第二天猴子又将剩下的香蕉吃了一半,禁不住诱惑,又多吃了一根香蕉。依此类推,每天都将剩余的香蕉吃一半后再多吃一根。到了第九天,猴子发现只剩一根香蕉了,请问这只猴子在第一天总共摘了多少根香蕉?
这个问题,我们可以从后往前推导,因为第九天仅剩一根香蕉,而且是因为前一天吃了一半后再多吃一根的结果,那么首先假设如果把多吃的一根还原回去的话(1+1=2),就等于只吃了一半的结果,也就是第八天吃了一半的情况下还剩余两根,而两根仅是第八天的一半(22=4),最后得出第八天的数量为四根香蕉。依此类推,(4+1)2=10,第七天就是十根香蕉。推导效果如图3-4所示,得出推导公式为(n+1)*2,可以获得前一天的香蕉数量。当你找到正确算法后,就可以使用循环语句多次推导即可得到第一天的香蕉数量。
推导演示如下图
猴子吃香蕉的问题-摘自Linux shell核心编程指南
具体脚本如下:

[root@centos7 ~]# vim monkey.sh
#!/bin/bash
#功能描述(Description):使用循环计算猴子吃香蕉的问题.
#初始化香蕉数量为1,也就是第九天香蕉数位1.
#每循环一次计算前一天的香蕉数量,循环8次得到第一天的香蕉数量.
banana=1
for i in {1..8}
do
    banana=$[(banana+1)*2]
done
    echo $banana
[root@centos7 ~]# chmod +x monkey.sh
[root@centos7 ~]# ./monkey.sh 
766
上一篇:Python-Collections模块之OrderedDict


下一篇:JavaScript数组去重