1. 程式人生 > >斐波那契數列遞迴演算法和非遞迴演算法以及其時間複雜度分析

斐波那契數列遞迴演算法和非遞迴演算法以及其時間複雜度分析

1、在學習資料結構這門課的過程中,發現斐波那契數列的遞迴演算法以及非遞迴演算法,以及其時間複雜度分析是一個小難點。所以特別總結一下。

斐波那契數列的表示式:

Fibonacci數列簡介:

F(1)=1

F(2)=1

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

2、(1)斐波那契數列的遞迴演算法思想描述:利用遞迴思想,每次計算當前的值時候,就要引用之前的兩個值,一步一步的遞迴,一直到最起始處,才能用到F(1)和F(2)。

遞迴演算法程式:

int recursive_method(int n)
{
    if (n == 1 || n == 2)
         return

 1;
   else
         return recursive_method(n - 1) + recursive_method(n - 2);
}

(2)遞迴演算法呼叫的順序舉例子。

Fib(5)的遞迴呼叫過程

圖1:Fib(5)的遞迴呼叫過程

在遞迴呼叫過程中Fib(3)被計算了2次,Fib(2)被計算了3次。Fib(1)被呼叫了5次,Fib(0)中被呼叫了3次。所以,遞迴的效率低下,但優點是程式碼簡單,容易理解。

(3)遞迴演算法時間複雜度為:O(2^(N/2))<=T(N)<=O(2^N)。這個時間複雜度參考具體的計算方法參考http://bbs.pediy.com/showthread.php?t=123051。

3、(1)斐波那契的非遞迴演算法

<span style="font-family:Microsoft YaHei;">int non_recursive_method(int n)
{
int p = 1;
int q = 1;
if (n == 1 || n == 2)
return 1;
else
{
for(int i = 3; i < n; i++)
{
int tmp = p;//將第一個值p賦給tmp
p = q;       //將第二個值q賦給p,以後每一次賦值都將得到的最新的F(n)賦給p,從後面語句可//以看出,q儲存的為最新的F(n)

q = tmp + q;
}
return q;
}
}</span>
(2)斐波那契非遞迴演算法時間複雜度為O(n)
注:考研的時候重點在於遞迴思想的理解方面。

相關推薦

數列演算法演算法及其時間複雜分析

1、在學習資料結構這門課的過程中,發現斐波那契數列的遞迴演算法以及非遞迴演算法,以及其時間複雜度分析是一個小難點。所以特別總結一下。 斐波那契數列的表示式: Fibonacci數列簡介: F(1)=

數列的兩種實現方式(迴圈)

public class Fibonacci { public static long F(int N){ int f0 = 0; int f1 = 1; int fn = 0; i

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

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

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

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

C語言實現數列的兩種方法(迭代)

兩種方法實現斐波那契數列,遞迴實現起來稍簡單些,思路也清晰些,但執行效率顯然不如迭代 下面是編譯通過的兩種方式實現斐波那契數列的C語言程式碼:/* * fibanacci.c * * Created on: 2015-3-16 * Author: flo

C語言數列的四種實現方式—,迭代,陣列,佇列

自部落格園轉載: 1.遞迴 效率低,除了最後一個數,每個數都被重複計算若干次 1: //遞迴實現 2: public static int Fib1(int n) 3: { 4: if (n < 3) 5: { 6

python實現數列:迭代對比

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

數列的兩種實現(歸)

result 數列 == 非遞歸 fib color 效率 i++ 思想 查找斐波納契數列中第 N 個數。 所謂的斐波納契數列是指: 前2個數是 0 和 1 。 第 i 個數是第 i-1 個數和第i-2 個數的和。 斐波納契數列的前10個數字是: 0, 1, 1, 2,

C語言經典演算法(八)——實現數列的兩種方法

後繼續整理演算法並寫出自己的理解和備註。 C++實現的:遞迴實現斐波那契數列 1、 遞迴實現斐波那契數列Fib(n) <1> 題目描述:輸入n值,求解第n項的斐波那契數列值 <2> 方法一:概念法 <3> 方法二:遞迴法 斐波那契數列值是值1

一列數的規則如下: 1、1、2、3、5、8、13、21、34...... 求第30位數是多少, 用演算法實現。//數列

1 public class MainClass 2 { 3 public static void Main() 4 { 5 Console.WriteLine(Foo(30)); 6 } 7 public static int Foo(int i) 8 {

演算法數列(Fibonacci數列

一、遞迴演算法 import java.util.Scanner; //Fibonacci數列:1,1,2,3,5,8,... //求該數列第n個數的值。 //數列滿足遞迴公式:F1=1,F2+=1,Fn=Fn-1 + Fn-2 public class Fibonacci { pub

演算法 迭代 動態規劃 數列 MD

Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱 MyAndroidBlogs baiqiantao bai

演算法實現數列

假定兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那麼一年以後可以繁殖多少對兔子? 這就是著名的斐波那契數列,也稱作兔子數列。 一、問題分析 剛開始,有1對幼兔,兔子總對數為1; 經過一個月後,幼兔長為小兔,兔子總對數為1

演算法--數列

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。n<=39 很容易我們想到使用遞迴求解: public class Solution { public int Fibonacci(in

常用演算法(一)——數列漢諾塔演算法

1.遞迴定義 在一個方法(函式)的內部呼叫該方法(函式)本身的程式設計方式。 2.遞迴實現 (1)錯誤寫法:   遞迴最容易引發的一個異常是棧溢位異常。   如果一直遞迴,沒有結束條件,就會無限進行下去,引發棧溢位異常。 package cn.kimtia

數列(不使用的快速演算法

void fabnacii(int n, int& fn) {if (n == 1){fn = 1;}else if (n == 2){fn = 1;}else if (n > 2){int* Fabnacci = new int[n];Fabnacci[0

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

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

【C語言】數列的兩種演算法(迴圈,

#include<stdio.h> int Fabio(int n) //迴圈 { int i; int f1 = 1; int f2 = 1; int f3 = 1; for(i = 2;i<n;i++) { f3 = f1 + f

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

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

演算法數列的備忘錄優化

遞迴演算法之斐波那契數列的優化 閒來無事嘗試了一下斐波那契的遞迴演算法 遞迴的斐波那契數列的演算法的效率驚人的低 得到43個數據需要8秒鐘 而優化過帶備忘錄的斐波那契數列,只需要0.2秒就可以打出64個數據 2秒可打出1000個 說明了線性