1. 程式人生 > >斐波那契數--遞迴和非遞迴實現

斐波那契數--遞迴和非遞迴實現

斐波那契數列是猶如0、1、1、2、3、5、8、·····、fn這樣的數,從前書本上一般介紹的方法都是遞迴的方法 
遞迴方法實現:

public static int FibonacciDigui(int n){
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        return FibonacciDigui(n - 1) + FibonacciDigui(n - 2);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

雖然遞迴實現比較好理解,程式碼十分簡潔,但是當n比較大的時候,效率會非常低。

 
當然我們可以用其他的方式來實現,用非遞迴的方式,這裡有兩種方法,一種是使用變數的方式,一種是用陣列。 
變數的方式:

public static int getFibonacciNum(int n){
        int first = 0;
        int second = 1;
        int fn = 0;
        for (int i = 2; i < n + 1; i++) {
            fn = first + second;
            first = second;
            second = fn;
        }
        return
fn; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

陣列的方式:

public static int getFibonacci(int n){
        int[] array = new int[n + 1];
        array[0] = 0;
        array[1] = 1;
        for (int i = 2; i < array.length; i++) {
            array[i] = array[i - 1] + array[i - 2];
        }
        return array[n];
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

這兩種非遞迴的方式效率在n比較大的時候將遠高於遞迴實現方式。

相關推薦

HDU 1568 Fibonacci【求的前4位/推式】

urn content new targe 接下來 bsp hide 斐波那契 href Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other

求第n個(分別用兩種方法求解)

斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55……這個數列從第3項開始,每一項都等於前兩項之和。 這裡分別用遞迴和非遞迴的方法實現: 遞迴 #define _CRT_SECURE_NO_WARNINGS 1 #include&l

分別實現求第n個

//非遞迴 int main() { int a = 0; int b = 1; int c = 0; int i = 0; int n = 0; printf("請輸入數字n(n>2)求第n個斐波那契數:"); scanf("%d",&n); for(i =

1.分別實現求第n個的典型題型

1.遞迴和非遞迴分別實現求第n個斐波那契數。 2.編寫一個函式實現n^k,使用遞迴實現 寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回組成它的數字之和,例如,呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19 編寫一個

python(階乘)

棧的基本思想 遞迴指的是呼叫自己的函式 每個遞迴函式都有兩個條件:基線條件和遞迴條件 棧有兩種操作:壓棧和彈棧 所有函式呼叫都進入呼叫棧 呼叫棧可能很長,這將佔用大量的記憶體 斐波那契數列:亦稱之為斐波那契數列(義大利語: Successione

--實現

斐波那契數列是猶如0、1、1、2、3、5、8、·····、fn這樣的數,從前書本上一般介紹的方法都是遞迴的方法 遞迴方法實現: public static int FibonacciDigui(int n){ if (n == 0) { return 0;

[c語言]用求第n個

程式碼 //1.1遞迴求第n個斐波那契數 #include<stdio.h> int fib(int n) { if(n<=2) return 1; else return fib(n-1)+fib(n-2); } int main

的python語言實現---叠代

put bsp print span return spa number n-2 遞歸實現 叠代實現如下: def fab(n): n1 = 1 n2 = 1 if n<1: print

斐波那契數是第一個數和第二個數都為1,從第三個數開始,後面的是是前面相鄰兩個數的和。定義的函式如下所示: int fib(int m) {     if (m == 1 || m == 2)         

『PHP學習筆記』系列四:利用函式呼叫思想解決【數列】問題【猴子吃桃問題】問題

什麼是函式遞迴思想? 遞迴思想:把一個相對複雜的問題,轉化為一個與原問題相似的,且規模較小的問題來求解。 遞迴方法只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量。 但在帶來便捷的同時,也會有一些缺點,函式遞迴的執行效率不高(多次呼叫時)。

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int fib(int n) { int a = 1; int b = 1; int c = 0; if (n <= 2) re

求第n個(不用的方法,用迴圈)

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int Fib(int n) { if (n == 1 || n == 2) // |按位或,||邏輯或 { retur

求第n個(用的形式)

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int Fib(int n) { if (n == 1 || n == 2) // |按位或,||邏輯或 { retur

及其取模運算

一、遞迴 1、遞迴:即函式自己呼叫自己,函式在呼叫時會進行引數例項化,開闢棧空間。 2、遞迴可簡化程式碼的編寫。易讀。 3、遞迴必須設定遞迴出口,否則會出現死迴圈 4、遞迴過程需一直開闢棧空間,執行速度慢,效率低。且存在棧溢位問題 5、相比較,迭代(非

法求

遞迴法求斐波那契數 思路分析:遞迴法最重要的兩點是:1)遞推關係:Fab(n)=Fab(n-1)+Fab(n-2); ​ 2)出口:n=1||n=2; 程式碼: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>

Python 求第n個

版本2.7 遞迴求第n個斐波那契數,函式要有個出口,目前我理解遞迴的運算都通過最基礎的運算完成。所有經過的運算都要通過出口的基礎值來累加的。 def fib(n): if n==0 or n==1: return n else:

歸分別實現求第n個

都是 一個 urn nbsp 非遞歸算法 stdio.h include i++ ren 菲波那切數列為:0 1 1 2 3 5 8 13 21 34... 規律:從第三個數字起後面的每一個數字都是前兩個數字的和。 非遞歸算法: 1 #include<stdio.

如何使用Python的方法來實現組合數,實現

組合數公式: C(n,m)=n!/((n-m)!*m!) 傳統演算法 def CombinationNum(n,m):     #n>=m n,m都是自然數     #找到一個出口     if m == 0 or n == m:         return

演算法計算

 寫遞迴要確定兩個:遞迴的終止條件;遞迴表示式。 class Program { //遞迴演算法就是自己呼叫自己 /// <summary>

C語言實現求第n個

一、非遞迴實現第N個菲波那切數列: 程式如下: #include <stdio.h> int fib(int n) { int a1 = 1; int a2 = 1; int a3