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

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

首先來說下遞迴,遞迴的思想是大事化小。

斐波那契數列: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("迭代顯示斐波那契數列:\