(java題目第2講)Fibonacci相關題目

2021-07-22 08:07:31 字數 3163 閱讀 5024

古典問題:有一對兔子,從出生後第3

個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

類似題目:乙隻青蛙一次上乙個台階或兩個台階,當上到n階時有多少種方法?

//這是乙個菲波拉契數列問題:輸入序號n返回得到對應費波那西數

程式實現1——函式自迭代

public int fntype1(int n)throws exceptionelse if(n==1||n==2)else if(n>2)else

}else }

此種方式缺點:大量迭代不斷消耗棧空間(搞web開發除錯維護的都應該知道伺服器棧資源的可貴,如果大量併發呼叫迭代導致伺服器棧資源遲遲得不到**,而導致web伺服器崩潰),效率底,函式自閉性比較弱(優秀的介面應該對輸入輸出可能出現的錯誤資訊進行捕捉,並提供清楚明了的處理結果),很容易出現錯誤,除錯困難,實際應用中一般不建議使用這種方式,使用時迭代次數也不能超過3次;

程式實現2——時間換空間  :利用三個變數

public int fntype2(int n)else if(index==1)else

temp1=temp2;

temp2=result; }

}return result; }

此方法主要使用於:使用場景一:對於物件或變數使用次數比較少,使用一次以後就不會再使用的場景;使用場景二:對於記憶體資源比較稀缺的實時性要求不是太高的嵌入式系統設計中多會採用此種方式;

程式實現3——空間換取時間

private static listfndata=new arraylist();

private static final int maxsize=50000;

private static  void setfndata()else if(index==1)else

temp1=temp2;

temp2=result; }

fndata.add(result); }

}/**

* 對外介面

* @title: getfndata

* @description: todo

* @param @param n

* @param @return   

* @return int (n beyond fndata.size() and n<0 return -1)

* @throws */

public int getfndata(int n)

if(fndata.size()>n&&n>=0)else }

此方法一般用於:物件或變數在程式執行的整個生命週期都存在或頻繁呼叫的場景,如呼叫外部webservice介面、抽象持續化層、常用配置檔案引數載入等等

**分割:

規律表:

月數 小兔 中兔 老兔 總數

1 1 0 0 1

2 0 1 0 1

3 1 0 1 2

4 1 1 1 3

5 2 1 2 5

6 3 2 3 8

7 5 3 5 13

在計算每一行時,大兔數為上月的大兔數加上月的中兔數,中兔數為上月的小兔數,小兔數為本月的大兔數,算總數為本月的小兔數加本月的中兔數加本月的大兔數。在觀察總數的過程中找出了規律:總數的第

一、二月都是1,以後的每一月是前兩月的和。數列為1,1,2,3,5,8,13,21,34,55,……

當n=50時,後項與前項的比是1.61803398874989,而前項與後項的比是0.61803398874989,即b/a的值與a/b的值相差1,假設後項與前項的比是φ,則有(φ-1)/φ=1,解這個方程得:φ= (√5+1) /2,這就是**分割。

當n充分大時,斐波納契數列後前項的比值,與前後項的比值,相差1,它們的比值是**分割!**分割是乙個十分有用的無理數。據此,把**分割可用乙個有理數近似表示,如斐波納契數列的第七項與斐波納契數列的第六項的比13/8,斐波納契數列的第九項與斐波納契數列的第八項的比34/21等都可以近似地表示為**分割,當然項數越後越精確。

題目要求:編寫程式在控制台輸出斐波那契數列前20項,每輸出5個數換行

方法一:publicclass fibonacci1}}

方法二:publicclass fibonacci2

system.out.println("斐波那契數列的前20項如下所示:");

for (int i = 0; i< arr.length; i++) }}

方法三:publicclass fibonacci3

public static voidmain(string args) }}

最近做的一道題目:總結一下

關於輸入乙個數字n得到第n項斐波那契數列,求呼叫函式的次數:

#include 

int cnt=0;

int fib(int n)

void main()

分析如下:

fib(1)或者fib(0)呼叫次數都是1;

fib(2)=fib(1)+fib(0),本身呼叫函式1次,加上fib(1)、fib(0)這兩次,共3次;fib(3)=fib(1)+fib(2),本身呼叫函式1次,加上fib(2)呼叫次數、fib(1)呼叫次數,共5(1+1+3)次;

fib(4)=fib(2)+fib(3),本身呼叫函式1次,加上fib(2)呼叫次數、fib(3)呼叫次數,共9(1+3+5)次;fib(5)=fib(3)+fib(4),本身呼叫函式1次,加上fib(3)呼叫次數、fib(4)呼叫次數,共15(1+5+9)次;
fib(6)=fib(4)+fib(5),本身呼叫函式1次,加上fib(4)呼叫次數、fib(5)呼叫次數,共25(1+9+15)次;
fib(7)=fib(5)+fib(6),本身呼叫函式1次,加上fib(5)呼叫次數、fib(6)呼叫次數,共41(1+15+25)次;fib(8)=fib(6)+fib(7),本身呼叫函式1次,加上fib(6)呼叫次數、fib(7)呼叫次數,共67(1+25+41)次;
所以,求第n位斐波那契數列的值時,呼叫函式的次數為 :1+(n-1)呼叫次數+(n-2)呼叫次數

第5講 if 語句 2

第5講if語句 2 一 注釋語句 注釋 注釋語句用來對程式塊進行說明,它對程式執行結果無任何影響。例1輸入三個數,將它們按從小到大的順序輸出 include void main void if a c if b c printf 排序結果是 f,f,f,a,b,c 二 if語句巢狀 p56 如果if...

第2講 turtle庫用法

1 本節主要從蟒蛇繪製講起,講解了其中涉及到的知識點 主要有 1 turtle,包括庫呼叫 其中詳細內容 如下 pythondraw.py 關鍵字import和turtle庫引用,庫引用方式 import turtle 這裡涉及到窗體空間座標 turtle空間座標 turtle角度座標 turtle...

第2講 C語言 賦值語句

第2講賦值語句 一 賦值語句 1 一般賦值語句 語法 變數名 表示式 例如 x b b 4 a c bookprice 128 5.6 功能 將右邊的表示式的值賦給左邊的變數。2 特殊賦值語句 語法 expr1 op expr2 它等價於 注意 expr2兩邊的園括號是必不可少的。x y 1 的意思...