1. 程式人生 > >斐波那契數列例項講解以及C++實現

斐波那契數列例項講解以及C++實現

斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從1963起出版了以《斐波納契數列季刊》為名的一份數學雜誌,用於專門刊載這方面的研究成果。

斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 特別指出:第0項是0,第1項是第一個1。

兔子繁殖問題

斐波那契數列又因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”。 一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那麼一年以後可以繁殖多少對兔子? 我們不妨拿新出生的一對小兔子分析一下: 第一個月小兔子沒有繁殖能力,所以還是一對 兩個月後,生下一對小兔對數共有兩對 三個月以後,老兔子又生下一對,因為小兔子還沒有繁殖能力,所以一共是三對 ------ 依次類推可以列出下表:
經過月數 0 1 2 3 4 5 6 7 8 9 10 11 12
幼仔對數 1 0 1 1 2 3 5 8 13 21 34 55 89
成兔對數 0 1 1 2 3 5 8 13 21 34 55 89 144
總體對數 1 1 2 3 5 8 13 21 34 55 89 144 233
幼仔對數=前月成兔對數 成兔對數=前月成兔對數+前月幼仔對數 總體對數=本月成兔對數+本月幼仔對數 可以看出幼仔對數、成兔對數、總體對數都構成了一個數列。這個數列有關十分明顯的特點,那是:前面相鄰兩項之和,構成了後一項。 設月數為n;則有 F(0)=1; F(1)=1; F(n)=F(n-1)+F(n-2);

黃金分割

隨著數列項數的增加,前一項與後一項之比越來越逼近黃金分割的數值0.6180339887..…

看4

楊輝三角

楊輝三角左對齊,成如圖所示排列,將同一斜行的數加起來,即得一數列1、1、2、3、5、8、…… 公式表示如下: f⑴=C(0,0)=1。 f⑵=C(1,0)=1。 f⑶=C(2,0)+C(1,1)=1+1=2。 f⑷=C(3,0)+C(2,1)=1+2=3。 f⑸=C(4,0)+C(3,1)+C(2,2)=1+3+1=5。 f⑹=C(5,0)+C(4,1)+C(3,2)=1+4+3=8。 F⑺=C(6,0)+C(5,1)+C(4,2)+C(3,3)=1+5+6+1=13。 …… F(n)=C(n-1,0)+C(n-2,1)+…+C(n-1-m,m) (m<=n-1-m)

質數質量

斐波那契數列的整除性與素數生成性 每3個連續的數中有且只有一個被2整除, 每4個連續的數中有且只有一個被3整除, 每5個連續的數中有且只有一個被5整除, 每6個連續的數中有且只有一個被8整除, 每7個連續的數中有且只有一個被13整除, 每8個連續的數中有且只有一個被21整除, 每9個連續的數中有且只有一個被34整除, ....... 我們看到第5、7、11、13、17、23位分別是素數:5,13,89,233,1597,28657(第19位不是)

數字謎題

三角形的三邊關定理和斐波那契數列的一個聯絡: 現有長為144cm的鐵絲,要截成n小段(n>2),每段的長度不小於1cm,如果其中任意三小段都不能拼成三角形,則n的最大值為多少? 分析:由於形成三角形的充要條件是任何兩邊之和大於第三邊,因此不構成三角形的條件就是任意兩邊之和不超過最大邊。截成的鐵絲最小為1,因此可以放2個1,第三條線段就是2(為了使得n最大,因此要使剩下來的鐵絲儘可能長,因此每一條線段總是前面的相鄰2段之和),依次為:1、1、2、3、5、8、13、21、34、55,以上各數之和為143,與144相差1,因此可以取最後一段為56,這時n達到最大為10。 我們看到,“每段的長度不小於1”這個條件起了控制全域性的作用,正是這個最小數1產生了斐波那契數列,如果把1換成其他數,遞推關係保留了,但這個數列消失了。這裡,三角形的三邊關係定理和斐波那契數列發生了一個聯絡。 在這個問題中,144>143,這個143是斐波那契數列的前n項和,我們是把144超出143的部分加到最後的一個數上去,如果加到其他數上,就有3條線段可以構成三角形了。 影視作品中的斐波那契數列 斐波那契數列在歐美可謂是盡人皆知,於是在電影這種通俗藝術中也時常出現,比如在風靡一時的《達芬奇密碼》裡它就作為一個重要的符號和情節線索出現,在《魔法玩具城》裡又是在店主招聘會計時隨口問的問題。可見此數列就像黃金分割一樣流行。可是雖說叫得上名,多數人也就背過前幾個數,並沒有深入理解研究。在電視劇中也出現斐波那契數列,比如:日劇《考試之神》第五回,義嗣做全國模擬考試題中的最後一道數學題~在FOX熱播美劇《Fringe》中更是無數次引用,甚至作為全劇宣傳海報的設計元素之一。

排列組合

一、一枚均勻的硬幣擲10次,問不連續出現正面的可能情形有多少種? 答案是144種。 利用標準斐波那契數列(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144),答案為F(10+2)。一枚均勻的硬幣擲n次,不連續出現正面的可能情形有F(n+2)種。 二、有一段樓梯有10級臺階,規定每一步只能跨一級或兩級,要登上第10級臺階有幾種不同的走法? 這就是一個斐波那契數列:登上第一級臺階有一種登法;登上兩級臺階,有兩種登法;登上三級臺階,有三種登法;登上四級臺階,有五種登法…… 1,2,3,5,8,13……所以,登上十級,有89種走法。這不是一個標準的斐波那契數列,初始化F(0)=0,F(1)=1,F(2)=2. 同leetcode上有一道題: You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

可用遞迴實現如下:

int stairs_climbing1(int n)
{
	if (n==0||n==1||n==2) return n;
	return stairs_climbing1(n-1)+stairs_climbing1(n-2);
}
但這種方法,每計算一次F(n)之前從F(0)到F(n-1)以及F(n-2)的過程都要重複執行一次,計算時間複雜度大,無法在規定時間內完成工作。改進演算法,記錄F(0)~F(n)的值,程式碼如下:
int stairs_climbing(int n)
{
	if (n==0||n==1||n==2) return n;
	vector<int >mem(n+1);
	mem[0]=0;
	mem[1]=1;
	mem[2]=2;
	int res;
	for (int i=3;i<n+1;i++)
	{
		mem[i]=mem[i-1]+mem[i-2];
	}
	return mem[n];
}

擴充套件

由上例可以看出,當初始值不一樣時,F(n)=F(n-1)+F(n-2)就可能會有不一樣的結果。

斐波那契—盧卡斯數列

盧卡斯數列1、3、4、7、11、18…,也具有斐波那契數列同樣的性質。(我們可稱之為斐波那契—盧卡斯遞推:從第三項開始,每一項都等於前兩項之和f(n) = f(n-1)+ f(n-2)。

佩爾數列

1,2,5,12,29,…,也有|2*2-1*5|=|5*5-2*12|=…=1(該類數列的這種特徵值稱為勾股特徵)。 佩爾數列Pn的遞推規則:P1=1,P2=2,Pn=P(n-2)+2P(n-1). 廣義斐波那契數列 類推到所有根據前兩項匯出第三項的通用規則:f(n) = f(n-1) * p + f(n-2) * q,稱為廣義斐波那契數列。 當p=1,q=1時,我們得到斐波那契—盧卡斯數列。 當p=1,q=2時,我們得到佩爾—勾股弦數(跟邊長為整數的直角三角形有關的數列集合)。 當p=2,q=-1時,我們得到等差數列。其中f1=1,f2=2時,我們得到自然數列1,2,3,4…。自然數列的特徵就是每個數的平方與前後兩數之積的差為1(等差數列的這種差值稱為自然特徵)。 具有類似黃金特徵、勾股特徵、自然特徵的廣義——斐波那契數列p=±1。 當f1=1,f2=2,p=2,q=0時,我們得到等比數列1,2,4,8,16…… 本文參考:
http://baike.baidu.com/link?url=uYAPJgZmzQDU8wuN0H4QjB1nBUqRPtNeNz5yAzDGpcUWhBqT6KNGvvC-9iroF6TxScwngt_jM4-6XGQDppiKEK

我們不妨拿新出生的一對小兔子分析一下: 第一個月小兔子沒有繁殖能力,所以還是一對 兩個月後,生下一對小兔對數共有兩對 三個月以後,老兔子又生下一對,因為小兔子還沒有繁殖能力,所以一共是三對 ------ 依次類推可以列出下表:
經過月數 0 1 2 3 4 5 6 7 8 9 10 11 12
幼仔對數 1 0 1 1 2 3 5 8 13 21 34 55 89
成兔對數 0 1 1 2 3 5 8 13 21 34 55 89 144
總體對數 1 1 2 3 5 8 13 21 34 55 89 144 233
幼仔對數=前月成兔對數 成兔對數=前月成兔對數+前月幼仔對數 總體對數=本月成兔對數+本月幼仔對數 可以看出幼仔對數、成兔對數、總體對數都構成了一個數列。這個數列有關十分明顯的特點,那是:前面相鄰兩項之和,構成了後一項。 設月數為n;則有 F(0)=1; F(1)=1; F(n)=F(n-1)+F(n-2);

黃金分割

隨著數列項數的增加,前一項與後一項之比越來越逼近黃金分割的數值0.6180339887..…

看4

楊輝三角

相關推薦

數列例項講解以及C++實現

斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞迴的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數

數列的解法以及思路(待更新)

斐波那契數列:1,1,2,3,5,8... int a=1; int b=1; int c=0; 很明顯,這裡c=a+b; 這是第一步,之後a=1; b=2; c=3; 因此,將之前的b賦值給a 將之前的c賦值給b 所以 1、c=a+b 2、a=b

【Java學習】for、while、do...while迴圈語句的學習,數列例項

for迴圈: 先判斷再迴圈,適用於迴圈次數已知。 for迴圈語法:for(表示式1;表示式2;表示式3){ 語句; //迴圈體 } 表示式1、3:任意表達式語句或空語句 表示式2:必須為布林型常量、變數或表示式 執行過程: 例項:求1+2+3+…+100的

fibonacii數列數列)的遞迴實現及迴圈實現

public class Fibonacii { public static long fibo(int num){ //遞迴方法 if(num==1||num==2) //定義出口 return 1; return fibo(num-1)+fibo(

數列的矩陣解法(java實現)

使用了二分法 import java.util.Scanner; /** * 求斐波那契數列<br/> * <pre> * [F(n+1) F(n)] [1 1 ]^n (n次方,可以使用歸納法證明)<br/> *

數列與跳臺階問題以及變態跳臺階

說明 pub jump IE for 純粹 urn 因此 討論 1.跳臺階問題:(其實就是很純粹的斐波那契數列問題)比較傾向於找規律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以總結出f(n) = f(n-1) + f

實現數列(js),以及複雜度降階

實現斐波那契數列(js),以及複雜度降階 背景——兔子數列 假設第1個月有1對剛誕生的兔子,第2個月進入成熟期,第3個月開始生育兔子,而1對成熟的兔子每個月會生1對兔子,兔子永遠不會死去……那麼,由1對兔子開始,12個月後會有多少對兔子呢? 問題分析: 我們拿新出生

數列與黃金分割比以及矩陣形式推導

數學上,斐波那契數列以遞迴的形式進行定義 F0=0F1=1Fn=Fn−1+Fn−2F0=0F1=1Fn=Fn−1+Fn−2 注意,遞迴的形式實現較為簡單明瞭,當然在程式設計實踐時,並不推薦遞迴的實現方式,因為存在大量的重複計算,斐波那契的優化實現

python例項數列

題目:斐波那契數列。 程式分析:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……。 在數學上,費波那契數列是以遞迴的方法來定義: F0 =0(n=0) F1 =1(n=1)F

[luoguP1962] 數列(矩陣快速冪)

truct ons 技術 pan opera http 快速冪 printf ble 傳送門 解析詳見julao博客連接 http://worldframe.top/2017/05/10/清單-數學方法-——-矩陣/ —&

Java 兔子問題(數列)擴展篇

aik 第一個 truct func main target htm bre trace Java 兔子問題(斐波那契數列)擴展篇 斐波那契數列指的是這樣一個數列 0, 1, 1, 2,3, 5, 8, 13, 21, 34, 55, 89, 144, ...對於這個

數列算法

string () lis temp -1 代碼 需要 cci key 今天研究了下Fibonacci算法,實現了遞歸和非遞歸兩種方式得到指定第n個的值。 代碼如下: 遞歸方式: public static int getFib(int a){ i

hdu 4549 M數列(矩陣高速冪,高速冪降冪)

else if stdlib.h article 1.0 ostream void 我們 memset font http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b

vijos - P1543極值問題(數列 + 公式推導 + python)

找到 span add gin python3 abi pri n) fill P1543極值問題 Accepted 標簽:[顯示標簽] 背景 小銘的數學之旅2。 描寫敘述 已知m、n為整數,且滿足下列兩個條件: ①

通過“”數列“”學習函數遞歸

range else ret bsp 方法 res ... fbi 結果 斐波那契數列:   f(0) = 0 f(1) = 1 f(2) = 1 f(3) = 2 f(4) = 3 f(5) = 8 .......f(n) = f(n - 2) + f(n - 1

[luoguP2626] 數列(升級版)(模擬)

sub std [1] 斐波那契數 == cnblogs () ios git 傳送門 模擬 代碼 #include <cmath> #include <cstdio> #include <iostream>

數列

python 練習 def bona(): while True: n = (input(‘你想打印幾個數的斐波那契數列:‘)) if not n.isdigit(): exit() a,b,m = 0,1,0

數列的遞歸和非遞歸解法

err nbsp div clas pan 斐波那契 ret ror ++ //遞歸解法 function fib(n){ if(n < 1){ throw new Error(‘invalid arguments‘); }

數列 x

技術分享 code clas 數列 tar eight 快速 記憶化 dev (一)通項公式 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4

劍指offer-矩形覆蓋-數列(遞歸,遞推)

思考 -1 com light logs src images 數列 斐波那契數 class Solution { public: int rectCover(int number) { if(number==0 || num