百度词条:
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
很多算法题会以斐波那契为基础思想,因此小伙伴们要对斐波那契非常的熟练,我们要保证随时随地可以在脑海中至少构建两种写出斐波那契的算法思路。
好的,我们开始今天的正题:
while循环构造斐波那契
代码:
int fib( int n )//返回第几位的斐波那契数
{
int i=0,a=0,b=1,c;
while(i<n)//使用i来判断第几位 这里我们从0 1开始计数因此需要考虑特殊情况 这里的数字经过测试应该是没有第0个数字一说的。
{
if(i==1)
c=1;
else
{
c=a+b;
a=b;
b=c;
}
i+=1;
}
return c;
}
这个函数写出来是为了应付pta的,不过也可以应付一下博客。函数的作用是返回第n位的斐波那契数,小伙伴们要是想打印出数列的话,在代码的if else模块中各加一个printf便可,不难操作,便不动手了
这里我们构造的思想
这里的C就是我们需要的数列,就是这样,很明了(博主画图水平有限),这里为什么要用一个if else呢?因为我们这种写法其实是忽略了第一个1的,如果小伙伴们很奇怪,为什么要忽略掉第一个1的话,博主建议小伙伴自己去思考一下。
我们设A=0,B=1,这样C=1,我们将C赋给下一个B,B赋给下一个A那么下一个C就是他前面两个数字的和了,那么while就到这里了,then,递归;
递归思想(斐波那契)
代码:
int fib( int n )
{
if(n==1||n==2)
return 1;
else
return fib(n-1)+fib(n-2);
}
首先呢,乍一眼一看,是不是感觉要比while循环要简洁,但是简洁是否意味着更方便呢?错了!我们从时间复杂度空间复杂度的角度说,利用递归实则会浪费大多时间与空间(虽然如今的电脑处理器并不在乎这点空间,但是谁又能保证他不会成为压死骆驼的最后一根稻草呢)小伙伴们写算法一定要本着时间复杂度与空间复杂度尽可能低的原则。(后面博主应该会专门出一期解析时空复杂度的博客,小伙伴们可以点波关注给博主涨涨人气哦)
回到主题:
众所周知,递归思想在处理很多问题的时候可以使我们另辟蹊径,这个函数块的作用是返回第n个斐波那契数,思路甚至都简单过前面的while循环,当输入为1或者2时,则返回1,否则开始递归,若是输入3则返回fib(1)+fib(2)是不是感觉相当简单,没错我刚开始也搞不懂为什么电脑会认为它更复杂,不过博主以后在时间复杂度那块会说到。