斐波那契數列遞迴演算法和非遞迴演算法以及其時間複雜度分析
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
else
return recursive_method(n - 1) + recursive_method(n - 2);
}
(2)遞迴演算法呼叫的順序舉例子。
圖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)斐波那契的非遞迴演算法
(2)斐波那契非遞迴演算法時間複雜度為O(n)<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>
注:考研的時候重點在於遞迴思想的理解方面。
相關推薦
斐波那契數列遞迴演算法和非遞迴演算法以及其時間複雜度分析
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個 說明了線性