斐波那契數列(遞迴與非遞迴)
首先來說下遞迴,遞迴的思想是大事化小。
斐波那契數列:1,1,2,3,5,8,13,21........
設f(n)是第n個斐波那契數,
當n<=2,斐波那契數都為1;
當n>2,那麼第f(n)個斐波那契數就等於前兩個斐波那契數之和。
遞迴的程式碼實現:
#include<stdio.h> int fbnq(int n) { if (n <= 2) return 1;//n=1,2 返還1; else return fbnq(n - 1) + fbnq(n - 2);//n>2 返還前兩個數之和 } int main() { int n = 0; scanf_s("%d", &n); int ret = fbnq(n); printf("%d\n", ret); return 0; }
輸入10,得到下圖:
得到第十個斐波那契數的同時,問題也來了,當輸入很大的數時
比如40,可以得到結果,但是計算所花時間比較長,大概需要10秒左右,當輸入更大的數計算時間更長。
為什麼會需要這麼長的時間呢?
看程式碼,我們設定一個全域性變數來統計一下,當要列印第40個斐波那契數時,第5個斐波那契數要計算多少次。
#include<stdio.h> int count = 0;//全域性變數 int fbnq(int n) { if (n == 5) count++; if (n <= 2) return 1;//n=1,2 返還1; else return fbnq(n - 1) + fbnq(n - 2);//n>2 返還前兩個數之和 } int main() { int n = 0; scanf_s("%d", &n); int ret = fbnq(n); printf("第%d個斐波那契數為%d\n",n, ret); printf("第5個斐波那契數計算%d次\n", count); return 0; }
列印第40個斐波那契數,第5個計算了很多次,這種程式碼效率太低。
這是完全可以用非遞迴來解決這種程式碼效率低下的情況;
非遞迴程式碼實現:
#include<stdio.h> int fbnq(int n) { int a = 1; int b = 1; int c = a; while (n > 2) { c = a + b;//從第三個數開始,斐波那契數等於前兩個數的和; a = b;//將前一個數給到a,開始下一次求值 b = c;//將斐波那契數給b,開始下一次求值 n--;//每求一次,n都要減一 } return c; } int main() { int n = 0; scanf_s("%d", &n); int ret = fbnq(n); printf("第%d個斐波那契數為%d\n",n, ret); return 0; }
同樣輸入40,這次輸出結果直接就打印出來了;
同樣的結果在不考慮溢位的情況下,非遞迴的計算速度明顯快很多,但是遞迴的程式碼可讀性較強,它比非遞迴的形式更加清晰。
所以,不同的情況採取的方式自然不同,這就讓我們在以後寫程式時更好的達到自己理想的效果。
相關推薦
斐波那契數列的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("迭代顯示斐波那契數列:\