C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

这篇具有很好参考价值的文章主要介绍了C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        众所周知,斐波那契数列是非常经典的一个数列,它的数学公式如下C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

        为了便于观察,我们列出它的几项:0  1  1  2  3  5  8  13  21......

        下面我们将介绍四种方法来用C语言计算机代码实现对斐波那契数列的求解,分别是:递归法,迭代法,矩阵求解法以及特殊性质公式。

一、递归法

        (PS:没有递归基础的建议先学习递归的基础概念,在此我仅简要介绍一下递归的思想和求解代码)

        在递归的实现中,我们知道,递归有两个要求:(1)进行递归这一操作所需要满足的条件 (2)此条件需要最终不被满足,使得函数的嵌套调用能够返回。在斐波那契数列中,我们知道当x=0时,返回值为0;当x=1时,返回值为1。所以,要求(1)中所需要满足的条件即x>=2;而要求(2)中要使该条件最终不被满足,即x不断减小,且最终为0或1。

        于是我们给出代码的实现:

int Fibonacci(int x)
{
    if (x >= 2)
        return Fibonacci(x - 1) + Fibonacci(x - 2);    //当x>=2时,继续按照公式f(x)=f(x-1)+f(x-2)嵌套调用
    else if (x == 1)
        return 1;    //当x=1时,返回1,同时嵌套调用开始返回
    else
        return 0;    //当x=0时,返回0,同时嵌套调用开始返回
}

        用递归的方法求解斐波那契数列是不是非常简单呢?C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

        然而! 用递归的方法也有一个很大的缺点:栈溢出!

        栈:函数及其形参的空间由栈分配,在函数调用未完成时,为其分配的空间并不会销毁!于是当递归中函数的调用次数过多时,会导致栈溢出的问题。在本题的递归中,我们能发现,当我们求

   F(5)= F(4)+F(3)

= F(3)+F(2)+F(2)+F(1)

= F(2)+F(1)+F(1)+F(0)+F(1)+F(0)+F(1)时,不仅对F(2)进行了多次调用,甚至还进行了多次计算!这就导致计算效率的大幅降低以及资源占用的大幅增加。

        于是我们给出第二种方法。

二、迭代法

                                                什么是迭代法?C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

        迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程。

        也就是说,这是一种各个变量直接相互作用的过程。

        分析思路:设有a、b、c三个变量,以及我们输入的第x项的x,令a=0(第一个斐波那契数)b=1(第二个斐波那契数),当x>=2时,c=a+b,同时再令a、b分别往右移一个数,如此往复x-2次,c的值就变成了第x个数的值。

        下面给出代码:

int Fibonacci(int x)
{
    int a = 0;
    int b = 1;
    int c = 0;
    if (x == 1)
        return 1;    //当x=1,返回1
    if (x == 0)
        return 0;    //当x=0,返回0
    while (x >= 2)   //输入x>=2时,进行迭代
    {
        c = a + b;   //每次迭代令c=a+b,即进行f(x)=f(x-1)+f(x-2)
        a = b;       //使得a,b往后移一个数字
        b = c;
        x--;
    }
    return c;
}

三、特殊性质公式法

        同递归法,只不过需要用到公式:

                F(n+m)=F(m)*F(n+1)+F(m-1)*F(n)

        在这个公式下,F(x)可以转换为F((x/2)   +   x-(x/2)),即一种二分思想,可以将时间复杂度为O(n)的算法转化为时间复杂度为O(log n)的算法。

        下面给出代码:

int Fibonacci(int x)
{
    if (x == 1 || x == 2)    //当x=2时也要返回1,否则将进入死循环。
        return 1;
    if (x == 0)
        return 0;
    int a = x / 2;
    int b = x - a;
    return Fibonacci(a + 1) * Fibonacci(b) + Fibonacci(a) * Fibonacci(b - 1);
}

C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

         然而虽然但是事实上这个方法还是不如迭代法来得实在的QoQ

  四、矩阵法

  C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)                      

         于是,只要先算出系数矩阵的n-1次幂,再用与之相乘即可求出F(n)

         下面是用矩阵快速幂的方法求出所需矩阵n-1次幂的代码:

(PS:小编只学了快速幂,这个矩阵快速幂的算法是自己琢磨出来的,可能不标准,如果有心可以去学一下矩阵快速幂的算法!!下面会给出一般快速幂的算法给各位小可爱们参考一下~)

int Fibonacci(int x)
{
    if (x == 0)
        return 0;
    if (x == 1 || x == 2)
        return 1;
    int a[2][2] = { {1,1},{1,0} };
    int b[2][2] = { {1,1},{1,0} };
    int c[2][2] = { {1,0},{0,1} };
    int d[2][2] = { {1,0},{0,1} };
    int t = x - 1;
    while (t)
    {
        if (t%2==1)
        {
            d[0][0] = c[0][0] * b[0][0] + c[0][1] * b[1][0];
            d[0][1] = c[0][0] * b[0][1] + c[0][1] * b[1][1];
            d[1][0] = c[1][0] * b[0][0] + c[1][1] * b[1][0];
            d[1][1] = c[1][0] * b[0][1] + c[1][1] * b[1][1];
            c[0][0] = d[0][0];
            c[0][1] = d[0][1];
            c[1][0] = d[1][0];
            c[1][1] = d[1][1];
        }
        b[0][0] = a[0][0] * a[0][0] + a[0][1] * a[1][0];
        b[0][1] = a[0][0] * a[0][1] + a[0][1] * a[1][1];
        b[1][0] = a[1][0] * a[0][0] + a[1][1] * a[1][0];
        b[1][1] = a[1][0] * a[0][1] + a[1][1] * a[1][1];  
        a[0][0] = b[0][0];
        a[0][1] = b[0][1];
        a[1][0] = b[1][0];
        a[1][1] = b[1][1];
        t >>= 1;
    }
    return c[0][0];
}

         其中F(x) = c[0][0]*F(1)+c[1][0]*F(0) = c[0][0]

快速幂代码:

int f(int a,int n)
{
    int ans = 1;
    while (n)
    {
        if (n & 1 == 1)    //判断n的最后一位是否为1
        {
            ans *= a;
        }
        a *= a;            //a每次自乘a,使得a在每次循环中分别为a,a^2,a^3...
        n >>= 1;           //n右移一,使得n的二进制表示中1所在的位置所代表的位全与a当前的次幂相同
    }
    return ans;
}

好啦这就是全部内容啦!!!

C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)

 文章来源地址https://www.toymoban.com/news/detail-406248.html

到了这里,关于C语言实现求解斐波那契数列的四种方法及优化处理(递归,迭代,特殊性质公式,矩阵快速幂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 斐波那契数列verilog实现

     前言:         该题为睿思芯科笔试题,笔试时长20分钟。         用代码实现斐波那契数列,代码需要对对enable敏感,当enable为高几周期,sum在enble为高的下一周期输出第几个斐波那契数,斐波那契数列的生成是后一个数字是前两个数字之和,如下序列:0、1、1、

    2024年02月13日
    浏览(39)
  • 使用斐波那契(Fibonacci)数列来测试各大语言的性能

    笔者使用最多的语言是C++,目前项目中在使用Go,也使用过不少其它语言,像Erlang,Python,Lua,C#等等。最近看到C#夺冠,首次荣获 TIOBE 年度编程语言,同时也看到网上有不少Java与C#之争的文章,于是就想要来做一个性能比较。 这里参与性能比较的是以下几门语言:Go、C#、

    2024年01月17日
    浏览(46)
  • Python 中如何实现斐波那契数列递归函数?

    斐波那契数列是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, ...... 该数列从第三项开始,每一项都等于前两项之和。  这里我们使用递归的方法来实现斐波那契数列:   这个递归函数的基本思路是:  1. 斐波那契数列的前两项是 1。所以如果 n = 1,直接返回 n。 2. 否则,计算前两项 fib(n-1

    2024年02月01日
    浏览(36)
  • C#面:使用 IEnumerable 实现斐波那契数列生成

    斐波那契数列(Fibonacci sequence),又称黄金分割数列 [1],因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”, 其数值为:1、1、2、3、5、8、13、21、34…… 在数学上,这一数列以如下递推的方法定z义: F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n

    2024年04月16日
    浏览(42)
  • 斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题

    Write once,Runanywhere. 🔥🔥🔥 本派文章详细斐波那契数列、青蛙跳台阶、汉诺塔(C语言Java通用)、递归练习题。 💥 💥 💥 如果你觉得我的文章有帮助到你,还请【关注➕点赞➕收藏】,得到你们支持就是我最大的动力!!! 💥 💥 💥 ⚡ 版权声明:本文由【马上回来了】原创、

    2023年04月08日
    浏览(53)
  • Java【动态规划】斐波那契数列模型, 图文思路详解 + 代码实现

    本篇总结动态规划中的 斐波那契数列模型 的解法和思路 按照以下流程进行分析题目和代码编写 思路分析步骤 代码编写步骤 1, 状态表示 1, 构造 dp 表 2, 状态转移方程 2, 初始化+边界处理 3, 初始化 3, 填表(抄状态转移方程) 4, 填表顺序 4, 返回结果 5, 返回值 / OJ链接 题目分析

    2024年02月08日
    浏览(56)
  • 用Go plan9汇编实现斐波那契数列计算

    斐波那契数列是一个满足递推关系的数列,如: 1 1 2 3 5 8 ... 其前两项为1,第3项开始,每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 我们将其改进一下,用更简单的方式描述,同时把变量的定义提到前边,并将返回的逻辑拿到函数末尾。 继续改进 继续改

    2024年01月20日
    浏览(40)
  • 递归以及斐波那契数列递归算法和迭代算法的实现与分析

    程序调用自身的编程技巧称为递归( recursion) 递归有两个过程,简单地说一个是 递的过程 ,一个是 归的过程 。 递归的两个必要条件 1. 存在限制条件 ,当满足这个限制条件的时候,递归便不再继续。 2.每次递归调用之后越来越 接近这个限制条件 . 递归本质就是函数调用

    2024年02月12日
    浏览(37)
  • JAVA-斐波那契数列

    输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例

    2024年02月10日
    浏览(50)
  • Python斐波那契数列

    斐波那契数列是一个经典的数学问题,在 Python 中可以使用多种方法来实现,下面是几个常见的实现方式: 1. 使用递归 ```python def fibonacci_recursive(n):     if n = 1:         return n     else:         return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) ``` 2. 使用循环 ```python def fibonacci_i

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包