头歌-猴子吃桃问题

猴子第一天摘下若干个桃子,当天吃了一半,后面又多吃一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。后面每天猴子都吃了前一天剩下的一半零一个。到第十天想再吃时,只剩下一个桃子。求第一天共摘了多少桃子。

输入格式

无。

输出格式

一个整数。

题目及思路分析:

正向(吃桃子顺序)思路:

  • 第一天的桃子除二减一得到第二天的桃子数……一直到第九天只剩下一个桃子(题目描述的是“第十天想再去吃的时候”,也就是说第十天没吃,只吃了九天)。
  • 数学表达式为:an−1​=2an​​−1
  • 已知条件是:a1​=1
  • 要求的结果:a10​

方法实现:

两种实现方法:

  • 由于有an​与an−1​的关系可考虑用递归的方法实现。
  • 也可先大致估计数据范围(a10​介于1000到5000之间),然后用遍历的方式,寻找满足上述数学关系的数。

代码参考:

递归:

  • 可将数学表达式转变成方法二的数学表达式,然后递归,具体代码参见方法二(递归)

反向(加桃子顺序)思路:

  • 第二天的桃子是第一天的桃子数加一再总体乘二,一直到第十天(同样只进行九次乘法操作——只吃了九天)
  • 数学表达式为:bn​=(bn−1​+1)×2
  • 已知条件是:b1​=1
  • 要求的结果:a10​

实现方法:

  • 由于有an​与an−1​的关系可考虑用递归的方法实现。
  • 从a1​开始,用递推关系进行九次循环,直接得到结果

代码参考:

递归:

 
  1. def f(n = 10 ): #默认参数为10,即求a10
  2. if n == 1:
  3. return 1 #当n为1的时候返回
  4. else :
  5. return (f(n-1) +1)*2 #否则调用递归
  6. print(f())

循环:

 
  1. Sum = 1 #第一天只有一个桃子
  2. for i in range(9): #用9次循环进行加桃子的操作
  3. Sum = (Sum + 1)*2
  4. print(Sum)

 或者不用递归,找到等式关系及循环次数直接用循环

#include<stdio.h>

int main(void){

    int x;

    x=1;

    int i;

    for(i=9;i>=1;i--){

        x=(x+1)*2;

    }

    printf("%d",x);

    return 0;

}

 

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值