輸入整數n,求斐波拉契數列第n個數。
利用f(n) = f(n-1) + f(n-2)的特性來進行遞迴,**如下:
**:
long long fib(unsigned int n)
缺陷:當n比較大時遞迴非常慢,因為遞迴過程中存在很多重複計算。
應該採用非遞迴演算法,儲存之前的計算結果,用空間換時間。
**如下:
#include#includeusing namespace std;
int main()
return 0;
}uint64 fibonacci(int n)
方法2:迭代法,通過儲存中間項避免重複計算,時間複雜度o(n);
#include #include int main(void)
if(n <= 0)
y = x;
printf("n = %d,fibonacci(n) = %d\n",n,y);
}
return 0;
}
方法3:公式法,時間複雜度o(1),因為公式中引入了無理數,所以不能保證結果的精度;#include
#include
#include
double
pow(
double
x,unsigned
int
n);
int
main(
void
)
return
0;
}
double
pow(
double
x,unsigned
int
n)
return
result;
}
方法4:分治策略,可以用矩陣來表示
則f2 = y2_11 = a(11表示矩陣的第1行1列元素).
現在剩下的問題就是求an了,可以把n用二進位制表示:n = ak*2^k + ak-1*2^k-1 + ... + a1*2 + a0,其中ai = 0 或1 ,i = 0,1,2... k。例如:n = 5 = b』101 = 1*22 + 0*21+1*20。這樣
則,我們知道an最多經過log2n乘法就能夠得到,而不用a*a*a這樣計算n次。
**實現:
#include #include const int maxlength = 10;
struct matrix
;// 方陣的乘法
void matrixmult(const matrix a, const matrix b, matrix &m)
return res.dat[0];
}int main(void)
return 0;
}
斐波拉契數列
斐波拉契數列 1 1 2 3 5 8 13 21 34.其中每乙個數字都是前兩個數字的和。遞迴計算 long fibonacci int n 非遞迴計算 long fibonacci int n return result 這個函式的遞迴實現使用了雙重遞迴 double recursion 函式對本...
斐波拉契數列
編寫彙編程序列印1 1000的斐波拉契數列 原始碼assume cs code,ss stack,ds data data segment fibo dw 0,1,64 dup 0 str db the fibo list is 0ah,0dh,data ends stack segment db ...
斐波拉契數列
斐波拉契數列 這個數列從第三項開始,每一項都等於前兩項之和。已知斐波拉契數列的前兩項都是1,我們定義求斐波拉契數列的第n項 n 50 的函式為fbnq,請補充完成對fbnq函式的定義。輸入格式 共一行,為乙個正整數。輸出格式 共一行,為乙個正整數。輸入樣例 7輸出樣例 13 斐波拉契數列 def f...