VJ水題堆 關於斐波那契數列的求解過程

2021-07-26 13:34:53 字數 1558 閱讀 6819

1.超級樓梯:

有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少種走法?

輸入資料首先包含乙個整數n,表示測試例項的個數,然後是n行資料,每行包含乙個整數m(1<=m<=40),表示樓梯的級數。

對於每個測試例項,請輸出不同走法的數量。

2.乙隻小蜜蜂...

有乙隻經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請程式設計計算蜜蜂從蜂房a爬到蜂房b的可能路線數。

其中,蜂房的結構如下所示。

乙隻小蜜蜂原題

3.骨牌鋪方格 

在2×n的乙個長方形方格中,用乙個1× 2的骨牌鋪滿方格,輸入n ,輸出鋪放方案的總數.

例如n=3時,為2× 3方格,骨牌的鋪放方案有三種,如下圖

骨牌鋪方格原題

很容易發現這些題都是利用斐波那契數列直接求解的題。或者抽象一點,都是通過遞迴方法進行求解。談及遞迴很容易想到的是利用函式的遞迴呼叫進行求解。比如說:

int fun(int x)

這樣的解法直接明了,但是在提交過程中總發現會te。仔細分析發現是對於每次運算的結果沒有進行儲存而造成了重複運算。比如在計算fun(40)時遞迴計算了fun(39)和fun(38),而在計算fun(39)的過程中又計算了一遍fun(38)。也就是說,計算過一遍的結果不能加以儲存,重複的計算造成了時間上的浪費。

這時候很容易想到用陣列來儲存對應的結果。那麼為了實現遞迴數列的計算,應該這樣操作

int a[55];

a[0]=a[1]=1

;for(int i=2

;i<55;i++)

a[i]=a[i-1]+a[i-2];

此時陣列中儲存的就應該是斐波那契數列的第n項了,這時候輸入乙個對應的值x,直接輸出a[x]即為問題的解,時間複雜度為o(n);

接下來自然而然的就會想,函式遞迴呼叫結合陣列也具有相同的能力儲結果

#include

#include

#include

using

namespace

std;

int a[55];

int func(int x)

int main()

但是,在實際過程中又出現了乙個不大不小的問題:資料溢位了!也就是說,32位的數字已經無法儲存結果了。因此我們需要64位的整型參與運算

針對不同的編譯器,有了兩種解決對策:

vc++:64位整型的數型別為_int64,那麼輸入輸出的時候就要寫成printf(「%i(大寫的i)64d」,a[50]);這種資料型別不支援輸入輸出流的》和《操作

gc++:64位整型的資料型別位long long (int),輸入輸出的時候寫成printf(「%lld」,a[50]);longlong型別同時支援輸入輸出流的》和<<;

也就是說,一類題讓我知道了兩種解題方法,兩個避開小陷阱的方法。

開心o( ̄▽ ̄)ブ

斐波那契數列 堆

斐波那契數列指的是這樣乙個數列 0,1,1,2,3,5,8,13,21,34,55,89,144 第0項是0,第1項是第乙個1。這個數列從第二項開始,每一項都等於前兩項之和。在數學上,斐波納契數列被以遞迴的方法定義 f0 0,f1 1,fn f n 1 f n 2 n 2,n n 性質 1 斐波那契...

求斐波那契數列

一 用陣列求取斐波那契數列第n項的數值 非遞迴 斐波那契數列求取思想 第n項 第n 1項 第n 2項 function getvalue n var j 0 while j n 1 return arr j else alert getvalue 8 求第八項的值 二 使用遞迴求取第n項的值 fun...

關於斐波那契數列

斐波那契數列是一種非常有意思的數列,由 00 0 和 11 1 開始,之後的斐波那契係數就由之前的兩數相加。用數學公式定義斐波那契數列則可以看成如下形式 f0 0f 0 0f0 0f1 1f 1 1f1 1fn fn 1 fn 2f n f f fn fn 1 fn 2 我們約定 fnf nfn 表...