【背景】
【思路1-递归】
- int Fibonacci(int n){
- if(n <= 2){
- return n;
- }
- return Fibonacci(n - 1) + Fibonacci(n - 2);
- }
进一步优化:
当n增大到一定数值,Fibonacci数列值会溢出,并且花费时间很长。
- long long Fibonacci(int n){
- if(n <= 2){
- return n;
- }
- return Fibonacci(n - 1) + Fibonacci(n - 2);
- }
【思路2-递推关系式的优化】
- long long Fibonacci(int n){
- long long* Fibonacci = (long long*)malloc(sizeof(long long)*(n+1));
- Fibonacci[0] = 0;
- Fibonacci[1] = 1;
- for(int i = 2;i <= n;i++){
- Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2];
- }
- return Fibonacci[n];
- }
该思路的另一种实现方法:
- long long Fibonacci(int n){
- int i;
- long long fibonacciA = 0;
- long long fibonacciB = 1;
- long long fibonacciC;
- if(n == 0){
- return 0;
- }
- else if(n == 1){
- return 1;
- }
- for(i = 2;i <= n;i++){
- fibonacciC = fibonacciA + fibonacciB;
- fibonacciA = fibonacciB;
- fibonacciB = fibonacciC;
- }
- return fibonacciC;
- }
【思路3-求解通项公式】
- int Fibonacci(int n) {
- double s = sqrt(5);
- // floor 返回小于或者等于指定表达式的最大整数
- return floor((pow((1+s)/2, n) - pow((1-s)/2, n))/s + 0.5);
- }
当n增大到一定数值,Fibonacci数列值会溢出。因为floor返回小于或者等于指定表达式的最大整数
【思路4-分支策略】
- #include <iostream>
- #include <malloc.h>
- #include <stdio.h>
- using namespace std;
- //矩阵乘法
- void MatrixMulti(long long matrix[2][2],long long matrix2[2][2]){
- long long a = matrix[0][0] * matrix2[0][0] + matrix[0][1] * matrix2[1][0];
- long long b = matrix[0][0] * matrix2[0][1] + matrix[0][1] * matrix2[1][1];
- long long c = matrix[1][0] * matrix2[0][0] + matrix[1][1] * matrix2[1][0];
- long long d = matrix[1][0] * matrix2[0][1] + matrix[1][1] * matrix2[1][1];
- matrix[0][0] = a;
- matrix[0][1] = b;
- matrix[1][0] = c;
- matrix[1][1] = d;
- }
- //Fibonacci数列
- long long Fibonacci(int value){
- if(value == 0){
- return 0;
- }
- long long A[2][2] = {1,1,1,0};
- //初试为单位矩阵
- long long Matrix[2][2] = {1,0,1,0};
- int n = value - 1;
- for(; n ;n >>= 1){
- //奇偶
- if(n&1){
- MatrixMulti(Matrix,A);
- }//if
- MatrixMulti(A,A);
- }//for
- return Matrix[0][0];
- }
- int main() {
- int i,n,height;
- while(scanf("%d",&n) != EOF){
- long long result;
- for(i = 0;i <= n;i++){
- result = Fibonacci(i);
- printf("%lld ",result);
- }//for
- }//while
- return 0;
- }
该思路另一种解析: