斐波那契数列的 递归 和 非递归(王道书P11)

目录

M1. 非递归

M2. 递归

时间复杂度

空间复杂度



M1. 非递归

//1.非递归
int f1(int n) {
    if(n == 0)
        return 0;
    if(n == 1)
        return 1;
    int a = 0, b = 1, t;
    for (int i = 0; i < n-1; ++i) { //注意此题这边是(n-1)
            t = a + b;
            a = b;
            b = t;
        }
       return t;
}

int main(){
    printf("%d",f1(4));
}

eg:

注:时间复杂度为O(n)

       空间复杂度为O(1)


M2. 递归

//递归:因为解决这个问题的方法是一样的,所以可以不断地自身调用自身
int f2(int n){
    if(n == 0)//递归的出口
        return 0;
    if(n == 1)//递归的出口
        return 1;
    return f2(n-1) + f2(n-2);
}

int main(){
    printf("%d",f2(4));
}

 eg:

 

 注:时间复杂度为 O(2^{n}

        空间复杂度为O(n)

时间复杂度

递归的时间复杂度的计算就是要关注递归调用了多少次,下图所示。

       假设一共有h层,不难发现,1到(h-1)层几乎处于一个比较满的状态,这个状态在循环次数上体现的是少了个常数,并不影响整个时间复杂度的计算。

       了解了这个之后,开始计算递归的时间复杂度。假设一共有h层,那么一共进行了多少次递归呢?

第1层:2^{0}

第2层:2^{1}

第3层:2^{2}

......

第(h-2)层:2^{h-3}

第(h-1)层:2^{h-2}

一共:2^{0}+2^{1}+2^{2}+......+2^{h-2} = 2^{0}*(1 - 2^{h-1})/(1-2)= 2^{h-1} - 1

 加上第h层的常数不改变时间复杂度

易知n = h

所时间复杂度为O(2^{n}


空间复杂度

树高为h,n = h;

所以空间复杂度为 O(n)。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
斐波数列可以通过归算法和归算法来实现。归算法是通过定义归函数,以前两个数的和作为当前数的值。归算法是通过迭代的方式,使用三个变量来保存前两个数的值,并不断更新这三个变量的值来计算当前数的值。 归算法的实现如下: ``` long long Fib(int N){ if (N < 3) return 1; return Fib(N - 1) + Fib(N - 2); } ``` 这个算法的基本思想是,当N小于3时,直接返回1;当N大于等于3时,返回前两个数的和。但是需要注意的是,归算法的效率较低,因为有很多重复的计算。 归算法的实现如下: ``` long long Fib(int N){ int First = 1; int Second = 1; int Third = 1; while (N > 2){ Third = First + Second; First = Second; Second = Third; N--; } return Third; } ``` 这个算法使用三个变量来保存前两个数的值,然后不断更新这三个变量的值来计算当前数的值。当N大于2时,通过循环不断更新变量的值,直到计算到第N个数为止。 需要注意的是,斐波数列在用归算法实现时,可能会遇到溢出的问题。因此,在使用归算法实现时,需要注意控制归的深度,以避免出现溢出的情况发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [斐波数列归和归算法)](https://blog.csdn.net/qq_45328505/article/details/103027461)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [斐波数列归算法与归算法](https://blog.csdn.net/qq_33951180/article/details/52484080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JAVA归与归实现斐波数列](https://download.csdn.net/download/weixin_38519234/12763817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值