1. 程式人生 > >斐波那契數列遞迴與非遞迴

斐波那契數列遞迴與非遞迴

斐波那契數列的表示式:

Fibonacci數列簡介:

F(1)=1

F(2)=1

F(n)=F(n-1)+F(n-2) (n>2)

遞迴演算法程式:

int f(int n)
{
if (n == 1 || n == 2)
return 1;
else
return f(n - 1) +f(n - 2);
}

時間複雜度為:
分析:T(n+1)=T(n)+T(n-1)=2*T(n-1)+T(n-2)=…=F(n)+F(n-1)=F(n+1)
由於直接遞迴呼叫,結果中的每一個1都來自最底層的F(1)和F(2),那麼為了求第n個數,就要呼叫F(n)次函式.由於斐波那契數列是指數增長,所以該演算法的時間複雜度也是指數增長,即O(2^n)

非遞迴演算法:

int F2(int n)
{
int[] a = new int[n];
a[0] = 1;
a[1] = 1;
for (int i = 2; i < n; i++)
{
a[i] = a[i - 1] + a[i - 2];
}
return a[n - 1];
}
時間複雜度為O(n)

相關推薦

數列的python實現(list實現)

斐波那契數列概念 斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……

數列(一)--對比動態規劃(JAVA)

兔子繁殖問題: 這是一個有趣的古典數學問題,著名義大利數學家Fibonacci曾提出一個問題:有一對小兔子,從出生後第3個月起每個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。按此規律,假設沒有兔子死亡,第一個月有一對剛出生的小兔子,問第n個月有多少

Python學習--數列--迭代法和法實現

斐波那契數列實現的兩種方式 迭代法: 使用迭代法速度快,運算幾乎不用等待,例如計算99代,可以瞬間出答案,效率比遞迴法快,但是程式冗雜。 def fib(n): n1 = 1 n2 = 1 n3 = 1 if n < 1:

數列3種解法(樸素、動態規劃、數學歸納)及演算法分析

本文來自網易公開課的<演算法導論>第3講分治法。讓我對分治法的使用有了一個新的認識斐波那契數列,又稱黃金分割數列,F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 下面我將使用Java(是的,又是Java,不過我覺得沒什麼問題,演

python實現數列:迭代和對比

迭代和遞迴 從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即一個函式呼叫本身;迭代是利用已知的變數值,根據遞推公式不斷演進得到變數新值得程式設計思想。 對於剛入門的程式設計小白而言,對遞迴的理解應該是要難於對迭代的理解的。下面將以python實現斐波那契

【矩陣乘法x2】LuoGu P1349 廣義數列&&LNSYOJ#395推式字首和

這是兩道矩陣的水題 題目描述 數列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n項和s[n]=f[1]+f[2]+……+f[n]的快速求法(答案取模10e9+7) 輸入格式 一個整數bb。 輸出格式 一個整數字首和。

數列C++語言C語言實現

斐波那契數列C++與C分別實現 介紹: 斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、

數列

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e2+10; ll a[MAXN]; ll F[MAXN]; ll f(ll n) ///遞迴 { if

Java中的組織形式、類物件、靜態的static關鍵字、最終的final關鍵字、方法傳參方式、(階乘、數列、漢諾塔)

Java程式的組織形式 Java程式需要把程式碼以類的形式組織起來,然後被Java編譯器編譯,再被JVM執行。Java程式是以類的結構為基礎的。 Java程式的基本要素 識別符號 識別符號命名規範 關鍵字(保留字) 關鍵字(保留字)具有專門的意義和用途

數列迴圈實現及複雜度分析

一、斐波那契數列的定義: 二 、遞迴實現: 經典例題(杭電2041):  AC程式碼: #include <iostream> using namespace std; int f[41]; int main() { int num,m;

數列的實現

0,1,1,2,3,5,8…這樣的數列稱作斐波那契數列 1、遞迴實現方式 //斐波那契數列遞迴實現 long long Fib1(long long n) { if (n<=1) retur

數列(Fibonacci)的效能對比

費波那契數列由0和1開始,之後的數就由之前的兩數相加 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,………. 遞迴演算法 用遞迴演算法來求值,非常好理解.虛擬碼: f(n) =

數列的迭代實現實現(c語言)

遞迴實現 #include<stdio.h> int Fib(int n){ // 自定義函式 if(n<0) return -1; else if(n==0) return 0; else if(n==1)

數列--實現

初識斐波那契數列: 斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子

數列實現(JAVA語言描述)

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34

數列

斐波那契數列的表示式: Fibonacci數列簡介: F(1)=1 F(2)=1 F(n)=F(n-1)+F(n-2) (n>2) 遞迴演算法程式: int f(int n) { if (n == 1 || n == 2) return 1; els

【C++】數列前N項的和演算法

定義:斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、1

數列()

首先來說下遞迴,遞迴的思想是大事化小。斐波那契數列:1,1,2,3,5,8,13,21........設f(n)是第n個斐波那契數,當n<=2,斐波那契數都為1;當n>2,那麼第f(n)個斐波那契數就等於前兩個斐波那契數之和。遞迴的程式碼實現:#include&l

JAVA 數列的實現

今天練習時碰到斐波那契數列,迴圈和遞迴的程式碼分別統計了一下執行時間。遞迴還是相當慢的。找了一篇介紹比較詳細的博文,閒暇時可以再看看。 連結package exrcise; public class Demo1 { public static void main(Str

數列迭代)

int Fbi(int i)/*這裡Fbi就是函式自己,等於在呼叫自己*/ {  if(i<2)   return i==0?0:1;  return Fbi(i-1)+Fbi(i-2); } int main() {  int i;  int a[40];  printf("迭代顯示斐波那契數列:\