斐波那契数列

表达式

为求得斐波那契数列的一般表达式，可以借助线性代数的方法。高中的初等数学知识也能求出。

首先构建等比数列

设
化简得

比较系数可得：
不妨设

解得：

又因为有，
即为等比数列。

求出数列{
  
    
      
        
          a
          
            n
          
        
        +
        α
        
          a
          
            n
            −
            1
          
        
      
    
    {\displaystyle a_{n}+\alpha a_{n-1}}
  
}

由以上可得：
变形得：
。
令

求数列{
  
    
      
        
          b
          
            n
          
        
      
    
    {\displaystyle b_{n}}
  
}进而得到{
  
    
      
        
          a
          
            n
          
        
      
    
    {\displaystyle a_{n}}
  
}

设，解得。
故数列为等比数列

即。而，
故有

又有
和

可得
得出表达式

求矩阵的特征值：
  
    
      
        λ
      
    
    {\displaystyle \lambda }

行列式：
当行列式的值为0，解得=或=

数论解法

实际上，如果将斐波那契数列的通项公式写成，即可利用解二阶线性齐次递推关系式的方法，写出其特征多项式（该式和表达斐波那契数列的矩阵的特征多项式一致），然后解出=，=，即有，其中为常数。我们知道，因此，解得。

用计算机求解

可通过编程观察斐波那契数列。分为两类问题，一种已知数列中的某一项，求序数。第二种是已知序数，求该项的值。
可通过递归递推的算法解决此两个问题。
事实上当n相当巨大的时候，O（n）的递推/递归非常慢……这时候要用到矩阵快速幂这一技巧，可以使递归加速到O(logn)。

与平方数的关系

斐波那契数列中，只有3个平方数：0、1、144。

和自然的关系

许多的生物构成都和斐波那契数列有正相关。例如人体从脚底至头顶之距离和从肚脐至脚底之距趋近于
,向日葵的种子螺旋排列有99%是。

相关的数列

费波那西数列是费波那西n步数列步数为2的特殊情况，也和卢卡斯数列有关。

巴都万数列

费波那西数列可以用一个接一个的正方形来表现，巴都万数列则是用一个接一个的等边三角形来表现，它有的关系。

佩尔数列

佩尔数列的递归公式为，前几项为0,1,2,5,12,29,70,169,408,...

相关猜想

斐波那契数列中是否存在无穷多个素数？
在斐波那契数列中，有素数：
2, 3, 5, 13, 89, 233, 1597, 28657, 514229, 433494437, 2971215073, 99194853094755497, 1066340417491710595814572169, 19134702400093278081449423917……
目前已知最大素数是第81839个斐波那契数，一共有17103位数。

程序参考

JavaScript迭代版
function fib(n) {
    var fib_n = function(curr, next, n) {
        if (n == 0) {
            return curr;
        }
        else {
            return fib_n(next, curr+next, n-1);
        }
    }
    return fib_n(0, 1, n);}alert(fib(40));
C语言通项公式版
#include <stdio.h>#include <math.h>int main(){
    int n;
    double constant_a = (1 + sqrt(5)) / 2;
    double constant_b = (1 - sqrt(5)) / 2;
    double constant_c = sqrt(5) / 5;
    double value_1 = 0;
    int value_2 = 0;
    scanf("%d", &n);
    if(n > 0)
    {
        for (int i = 0; i < n; i++)
        {
             value_1 = constant_c * (pow(constant_a, i) - pow(constant_b, i));
             value_2 = (int)value_1;
             printf("%d\n", value_2);
        }
        return 0;
    }
    else
    {
        return -1;
    }}

c++通项公式版
#include <iostream>#include <cmath>using namespace std;int main(){
    unsigned long long n;
    double ca = (1 + sqrt(5)) / 2;
    double cb = (1 - sqrt(5)) / 2;
    double cc = sqrt(5) / 5;
    double v1 = 0;
    double v2 = 0;
    cout <<" ";
    cin>>n;
    if(n > 0)
    {
        for (unsigned long long i = 0; i < n; i++)
    {
            v1 = cc * (pow(ca, i) - pow(cb, i));
        v2 = (int)v1;
        cout <<v2<<endl;
    }
    return 0;
    }
    else
    {
        return -1;
    }
        cout <<'/b';}
Python语言通项公式版
# Fibonacci numbers moduledef fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
fibs = [0, 1]numZS = int(input('How many Fibonacci numbers do you want? '))for i in range(numZS-2):
    fibs.append(fibs[-2] + fibs[-1])print fibs
Common Lisp
(defun fibs (x)
  (cond ((equal x 0) 1)
        ((equal x 1) 1)
        (t (+ (fibs (- x 1))
              (fibs (- x 2))))))(defun fibs (x)
  (do ((n 0 (+ n 1))
       (i 1 j)
       (j 1 (+ i j)))
      ((equal n x) i)))
Go语言通项公式版：
package mainimport "fmt"func fibonacci(n int) int {
if n < 2 {
return n
}
return fibonacci(n-2) + fibonacci(n-1)}func main() {
var i int
for i = 0; i < 10; i++ {
fmt.Printf("%d\t", fibonacci(i))
}}
Java语言通项公式版：
public int fibonacci(int n){
    if(n<2){
     return n;
    }else {
      return fibonacci(n-1)+fibonacci(n-2);
    }}
Java语言快捷版：
public int fibonacci(int n){
    if(n<2){
     return n;
    }else {
      int[] ans = new int[n];
          ans[0] = 1;
          ans[1] = 2;
          for(int i=2;i<n;i++) {
              ans[i]=ans[i-1]+ans[i-2];
          }
          return ans[n-1];
    }}
C语言阵列版：
#include <stdio.h>#include <stdlib.h> int main(){   
     int n,s,L;
     printf("輸入長度");
     scanf("%d",&L);
     while(L<0)
     {
     printf("錯誤"); 
     return 0;
 }
     int a[L]; 
     int x=1,y=2;
     a[0]=x;
     a[1]=x;
     a[2]=y;
 for(n=3;n<L;n++)
 {  
 a[n]=a[n-1]+a[n-2];  
 }
       for(n=0;n<L;n++)
     {
         printf("%d ",a[n]);
     }
     system("pause");
     return 0;}