猴子吃桃问题

22 篇文章 0 订阅
6 篇文章 0 订阅

猴子吃桃问题


问题描述

有一只猴子第一天摘下若干个桃子,当即吃掉了一半,有多吃了一个;第二天又将剩下的桃子吃掉一半,有多吃了一个;按照这样的吃饭每天都吃掉前一天剩下的一半又多一个。到了第10天,就剩下一个桃子。问题,这个桃子第一天摘了多少个桃子。

递推算法

#include <stdio.h>

int main() {

    int n;
    while (scanf("%d", &n)) {
        int ans = 1;
        for (int i=1; i<n; i++) {
            ans = ans*2 + 2;
        }
        printf("%d\n", ans);
    }

    return 0;
}

算法分析:

keyvalue
测试输入10
测试输出1534
时间复杂度O(N)
空间复杂度O(1)
时间复杂度:

Space(N) = Heap(N) + Stack(N)

     Heap(N):额外申请堆内存的空间大小
     Stack(N):   表示函数栈的最大深度

由于此处没有申请额外堆内存空间,且函数栈的最大深度为1,所以时间复杂度为1。

递归算法

#include <stdio.h>

int fruit_num(int i){
    if(i==1)
        return 1;
    else
        return 2*fruit_num(i-1)+2;
}

int main(){

    int n;
    while (scanf("%d", &n)) {
        int ans = fruit_num(n);
        printf("%d", ans);
    }
    return 0;
}

算法分析:

keyvalue
测试输入10
测试输出1534
时间复杂度O(N)
空间复杂度O(N)
时间复杂度:

Space(N) = Heap(N) + Stack(N)

     Heap(N):额外申请堆内存的空间大小
     Stack(N):   表示函数栈的最大深度

由于此处没有申请额外堆内存空间,且函数栈的最大深度为N,所以时间复杂度为N。

栈的深度测试:

#include <stdio.h>

int fruit_num(int i){
    printf("函数 %d进栈\n", i);
    if(i==1){
        printf("函数%d弹栈\n", i);
        return 1;
    }
    else{
        int ans = 2*fruit_num(i-1)+2;
        printf("函数%d弹栈\n", i);
        return ans;
    }
}

int main(){

    int n;
    while (scanf("%d", &n)) {
        int ans = fruit_num(n);
        printf("%d\n", ans);
    }
    return 0;
}

结果:

函数 10进栈
函数 9进栈
函数 8进栈
函数 7进栈
函数 6进栈
函数 5进栈
函数 4进栈
函数 3进栈
函数 2进栈
函数 1进栈
函数1弹栈
函数2弹栈
函数3弹栈
函数4弹栈
函数5弹栈
函数6弹栈
函数7弹栈
函数8弹栈
函数9弹栈
函数10弹栈
1534

三目运算化简代码

#include <stdio.h>

int fruit_num(int i){

    return i==1?1:2*fruit_num(i-1)+2;

}

int main(){

    int n;
    while (scanf("%d", &n)) {
        int ans = fruit_num(n);
        printf("%d\n", ans);
    }
    return 0;
}
时间复杂度:

Space(N) = Heap(N) + Stack(N)

     Heap(N):额外申请堆内存的空间大小
     Stack(N):   表示函数栈的最大深度

由于此处没有申请额外堆内存空间,且函数栈的最大深度为N,所以时间复杂度为N。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值