Fibonacci求解

2024-06-19 15:38
文章标签 求解 fibonacci

本文主要是介绍Fibonacci求解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        想想刚刚学C语言的时候,一开始接触递归的时候,感觉这东西实在是太不可思议了,可以将程序变得异常简洁并且非常易于理解。然后啥问题都想问递归上去扯,搞出个递归公式出来,问题就基本解决了大笑大笑大笑但是随着学习的深入,渐渐也道听途说到递归也不是那么好,因为对函数的递归调用会造成巨大的开销而且程序的运行速度也会受到限制。最近也上了些数据结构,发现书上给出递归算法的同时也会给出非递归算法!瞬间感觉,非递归好像更牛逼的样子!(关于数据结构的博文接下来也会有的,应该会结合和算法导论的阅读,我会努力写出各种非递归算法的)其实,在运用递归算法的时候,你并不一定对整个结构有完美的把握,而非递归需要你对每个细节有更完美的把握,这不论对程序的理解还是编码能力都是巨大的提高。

      不知不觉居然扯了这么多生气生气生气其实我是来说说Fibonacci的快速求解的,结合了书上写的,已经在看书上的解法前自己写的一些程序(居然完全不一样!)。首先是把递归求解改为非递归啦,这个应该不代码,直接上代码也就不解释什么了。

unsigned long FIB_IT(unsigned long n)
{unsigned long f_1=1,f_2=1,i,temp;if(n==1||n==2)return 1;for(i=0;i<n-2;i++){temp=f_2;f_2=f_1+f_2;f_1=temp;}return f_2;
}

不过书上给出了一个用矩阵求解Fibonacci的方法,直接将O(n)的复杂度变为了O(lgn)。不过当初线代完全是靠考前刷题才拿的高分,考完就忘了,要是我估计一辈子也想不出这个方法的。其实思路也是挺简单的,附张图好了

只要知道矩阵的乘法就知道这个式子其实和Fibonacci的递推公式是一样的。因此一直推下去,就可以得到(Fn,Fn-1)


而那个n-2次方的矩阵,我们完全可以用上篇博文里的数值自乘的递归方法求解,而这也是这个程序速度更快的关键啦!下面还是结合代码来分析吧

unsigned long FIB_IT(unsigned long n)
{unsigned long aa,bb,cc,dd;if(n==1||n==2)return 1;Matrix(1UL,1UL,1UL,0UL,n-2,&aa,&bb,&cc,&dd);return aa+bb;
}void Matrix(unsigned long a,unsigned long b,unsigned long c,unsigned long d,\int n,unsigned long *aa,unsigned long *bb,unsigned long *cc,\unsigned long *dd)
{unsigned long a1,b1,c1,d1,ta,tb,tc,td;if(n==1){*aa=a,*bb=b,*cc=c,*dd=d;return;}Matrix(a,b,c,d,n>>1,&a1,&b1,&c1,&d1);*aa=ta=a1*a1+b1*c1;*bb=tb=a1*b1+b1*d1;*cc=tc=a1*c1+d1*c1;*dd=td=b1*c1+d1*d1;if(n&0x01)   {//*aa=a*(*aa)+b*(*cc);//*bb=a*(*bb)+b*(*dd);//*cc=c*(*aa)+d*(*cc);//*dd=c*(*bb)+d*(*dd);*aa=a*ta+b*tc;*bb=a*tb+b*td;*cc=c*ta+d*tc;*dd=c*tb+d*td;}
}

关键是那个递归函数Matrix,递归的边界值是n==1,那个时候只要将n-2次的那个矩阵返回就可以了。有一点要注意的是,当n为偶数的时候,恰好能分为两个一样的子矩阵,此时只要将子递归函数返回的矩阵自乘即可。不过如果n为奇数的话,因为子递归函数的参数是n/2,将其递归返回的子矩阵相乘在次数上与n还差1,所以还要在已求得的子矩阵乘积的基础上再乘一个(1,1,1,0)这个矩阵。在此时我就反了个非常非常低级的错误,代码就是被注释掉的那部分,竟然忘了赋值运算后值就变了= =差点debug到崩溃。

最后经过递归后,第一个Matrix返回的就是(1,1,1,0)的n-2次的矩阵啦,而Fn=a+b,Fn-1=c+d,看那个矩阵运算的式子就知道了。

为了检验它的速度我还真测试了一下,我求第1000个Fibonacci数100000次,用两种方法,出结果的速度真的是差很多的。也算再次感觉到了优秀算法的巨大魅力了吧大笑大笑大笑


这篇关于Fibonacci求解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075445

相关文章

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

js,给定一个数,如何求Fibonacci值

/*给定一个数,如何求Fibonacci值::F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)*/ function fibonacci(n){        if(n<2){             return n;          }        return fibonacci(n-1)+fibonacci(n-2); } alert(fibonacci(6)

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

【练习7】Fibonacci数列

链接:https://www.nowcoder.com/practice/18ecd0ecf5ef4fe9ba3f17f8d00d2d66 分析: 当n为15的时候,可以用Math.min(c-n,n-b)来判断哪个是变成斐波那契数的最小步数。 public class Main {public static void main(String[] args) {Scanner i

Java 快速求解x的x次幂结果为10

1.问题描述 如果x的x次幂结果为10(如图所示),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字。 可以使用牛顿迭代公式进行求解,因为是逼近算法可以大大减少运算次数 public static void main(String[] args) {int i = 0;double x1 = 2.5;while (true) {i++;//x^x - 10 = 0//这一步

最值求解 | 管理类联考数学专项

日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考: b站跟着曦曦老师玩转【最值】

2024数学建模国赛A题详细思路:基于空间几何运动学和优化模型matlab求解

2024数学建模国赛A题“板凳龙”闹元宵 2024高教社杯数学建模竞赛A题B题C题D题E题完整成品文章和全部问题的解题代码完整版本更新如下:https://www.yuque.com/u42168770/qv6z0d/rytbc1nelty1mu4o % 定义常量L_head = 3.41; % 龙头长度(米)L_body = 2.20; % 龙身长度(米)spiral_pitch =