算法 | 两种方式实现斐波那契数

简介: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....

前言

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”


一、递归实现斐波那契数

  • 首先,我们要知道,要实现递归,就要:

    1. 把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
    2. 其次,递归不能无限循环下去,需要结束条件
  • 然后,用递归的思想去分析斐波那契数的特点,把它拆分成一个个相似的小问题,再确定结束递归的条件

在这里插入图片描述

  • 我们发现,除了前两个数1,后面每个数都是它的前两个数之和。于是我们就可以确定出:

    1. 每一个小问题就是==用前两个数之和计算出后一个数==
    2. 停止递归的条件是当n<=2
  • 所以,第n个斐波那契数肯定是,第(n-1)个斐波那契数和第(n-2)个斐波那契数之和。根据这个想法,写出代码,并加上结束条件
int fibo_num(int n)
{
    if (n > 2)
        return fibo_num(n - 1) + fibo_num(n - 2);
    else
        return 1;
}
输出结果: 在这里插入图片描述

二、循环实现斐波那契数

  • 其实非递归方法(循环)更容易想到怎么写,刚刚也已经分析过了。只要给出前两个数1,然后每前两个数之和就是下一个数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//斐波那契数(非递归)
int main()
{
    int n = 0;
    while (~scanf("%d", &n))
    {
        if (n <= 2)
            printf("第%d个斐波那契数是1\n", n);
        else
        {        
            int a = 1;
            int b = 1;
            int c = 0;
            for (int i = 3; i <= n; i++)
            {
                c = a + b;
                a = b;
                b = c;
            }
            printf("第%d个斐波那契数是%d\n", n, c);
        }
    }
    return 0;
}
输出结果: 在这里插入图片描述

三、比较递归与非递归实现斐波那契数

3.1 非递归

  • 很简单的原理没啥好讲的哈哈。咱们就看计算的次数叭~
咱们加入 count来计数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//斐波那契数(非递归)
int main()
{
    int n = 0;
    int count = 0;
    while (~scanf("%d", &n))
    {
        if (n <= 2)
            printf("第%d个斐波那契数是1\n", n);
        else
        {        
            int a = 1;
            int b = 1;
            int c = 0;
            for (int i = 3; i <= n; i++)
            {
                count++;
                c = a + b;
                a = b;
                b = c;
            }
            printf("第%d个斐波那契数是%d\n", n, c);
            printf("循环了%d次\n", count);
        }
    }
    return 0;
}
输出结果: 在这里插入图片描述

3.2 递归

  • 假如我们求第6个斐波那契数是8,我们来看一下递归的原理图

在这里插入图片描述

可以看出来,貌似计算了挺多次,我们用代码算算看
#include<stdio.h>
//斐波那契数(递归)
count = 0;
int fibo_num(int n)
{  
    count++;
    if (n > 2)
        return fibo_num(n - 1) + fibo_num(n - 2);
    else
        return 1;
}

int main()
{
    int n = 0;

    while (~scanf("%d", &n))
    {
        int result = fibo_num(n);
        printf("第%d个斐波那契数是%d\n", n, result);
        printf("递归了%d次\n", count);
    }
    return 0;
}
输出结果: 在这里插入图片描述居然用了这么多次!!!
  • 最恐怖的还不是这,假如你要计算第40个斐波那契数?

在这里插入图片描述

  • 假如第50个呢?反正博主的电脑没跑出来。。。

四、总结

  • 总之,递归让代码变得简洁,但并不代表效率就提高了,要具体情况具体分析哦~

在这里插入图片描述

相关文章
|
8月前
|
Python
Python实现递归的方式来生成斐波那契数列
Python实现递归的方式来生成斐波那契数列
|
7月前
|
算法
【超直白】算法:斐波那契数列
【超直白】算法:斐波那契数列
【超直白】算法:斐波那契数列
|
7月前
|
算法 Java 测试技术
斐波那契数列的四种实现算法
斐波那契数列的四种实现算法
146 3
|
7月前
|
算法 数据挖掘 大数据
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
深入解析力扣172题:阶乘后的零(计算因子5的方法详解及模拟面试问答)
|
7月前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
511 1
|
8月前
|
算法 搜索推荐 程序员
第五十一练 请以递归方式实现计算两个整数的最大公约数的函数
第五十一练 请以递归方式实现计算两个整数的最大公约数的函数
42 0
|
8月前
|
算法 搜索推荐 程序员
第四十四练 请以递归方式实现计算阶乘的函数
第四十四练 请以递归方式实现计算阶乘的函数
57 1
|
存储 人工智能 算法
【双指针、位运算、离散化、区间合并】思路讲解及代码实现
用一篇Blog来讲解下最近学到的双指针、位运算、离散化、区间合并等算法,为日后的刷题打下坚实的基础。
113 0

热门文章

最新文章