求斐波那契数列第n项的值
百度到的斐波那契数列定义:
斐波那契数列( ),又称黄金分割数列、因数学家列昂纳多·斐波那契( )以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列: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*)
方法一:递归
数列的第n项(除第1项和第2项)是第n-1项与第n-2项的和。数列满足递归的关系,故可用递归算法求第n项的值。
用递归求解,最重要的事是确定结束条件,给算法一个出口。本题中结束递归的条件为:n等于1或n等于2。
算法如下:
int (int* n)
step1:若n等于1或n等于2, 1;否则,进入step2;
step2: (n-1)+(n-2);
代码实现:
int Fibonacci(int* n) { if(n==1||n==2) return 1; else return Fibonacci(n-1)+Fibonacci(n-2); }
方法二:迭代
从斐波那契数列的第1项开始,按递推公式找到数列的每一项的值,直到找到第n项的值。
1 1 -> 1 1 2 -> 1 1 2 3 -> 1 1 2 3 5-> 1 1 2 3 5 8 -> …
代码如下:
int Fibonacci(int* n) { int i, n1=1, n2=1, sum=0; for(i=3;in;i++) { sum = n1+n2; n1 = n2; n2 = sum; } return sum; }
方法三:用栈还原方法一的递归算法(注:本方法纯属个人练手,可跳过)
本题方法一的递归算法,有点类似二叉树的中序遍历。趁最近正在学二叉树,感觉非常打脑壳,用这个斐波那契数列递归算法非递归化找下手感。
直接放伪代码了:
int Fibonacci (int n) { if(n==0||n==1) return 1; answer=0; for(i=n;;i--)//n到2依次入栈 { if(i==1) { answer += 1; //i等于1,不入栈,把第2项的数值1加在answer上 break; } else push(stack, i);//i大于1就入栈 } while(!empty(stack)) { top = gettop(stack); if(top-2==0||top-2==1)//如果栈顶的数值-2等于0或1,把数值1加到answer上(第1项的值和第2项的都等于1) { answer += 1; pop(stack);//此时top项已经计算完了(top-1项和top-2项的值都加在了answer上),弹出top项 } else { pop(stack); push(stack, top-2); for(i=gettop(stack)-1;;i--)//top-1到2依次入栈 { if(i==1) { answer += 1; //i等于1,不入栈,把第2项的数值1加在answer上 break; } else push(stack, i); //i大于1就入栈 } } } return answer;//最后,answer即为第n项的值 }
完
评论列表