小編是一個(gè)有著6年工作經(jīng)驗(yàn)的工程師,關(guān)于C++編程,自己有做材料的整合,一個(gè)完整的C++編程學(xué)習(xí)路線,學(xué)習(xí)資料和工具,能夠進(jìn)我的群10048,-83029收取,免費(fèi)送給大家,希望你也能憑著自己的努力,成為下一個(gè)優(yōu)秀的程序員
背景說(shuō)明
Fibonacci為1200年代的歐洲數(shù)學(xué)家,在他的著作中曾經(jīng)提到:「若有一只免子每個(gè)月生一只小免子,一個(gè)月后小免子也開始生產(chǎn)。起初只有一只免子,一個(gè)月后就有兩只免子,二個(gè)月后有三只免子,三個(gè)月后有五只免子(小免子投入生產(chǎn))......。
如果不太理解這個(gè)例子的話,舉個(gè)圖就知道了,注意新生的小免子需一個(gè)月成長(zhǎng)期才會(huì)投入生產(chǎn),類似的道理也可以用于植物的生長(zhǎng),這就是Fibonacci數(shù)列,一般習(xí)慣稱之為費(fèi)氏數(shù)列,例如以下: 1、1 、2、3、5、8、13、21、34、55、89......
算法說(shuō)明
仔細(xì)觀察這個(gè)數(shù)列,會(huì)發(fā)現(xiàn),除了第1個(gè)數(shù)和第2個(gè)數(shù)除外,從第3個(gè)數(shù)開始,第N個(gè)數(shù)等于它前面兩個(gè)數(shù)之和,也就是這個(gè)數(shù)列的通項(xiàng)公式為f(n)=f(n-1)+f(n-2) (n>=2,n∈正整數(shù))。
解法
這道題,就像是我們高中時(shí)的數(shù)學(xué)題,就是給一個(gè)背景,然后算第N項(xiàng)或者前N項(xiàng)和。
我們一般的步驟都是先找數(shù)列的關(guān)系,然后推導(dǎo)出它的通項(xiàng)公式,在求解。而費(fèi)氏數(shù)列的通項(xiàng)公式就是如下:
① f(n)=n,(n<=1,n∈正整數(shù))
② f(n)=f(n-1)+f(n-2) (n>=2,n∈正整數(shù))
所以,根據(jù)這個(gè)通項(xiàng)公式,我們就可以求解了。
public class 費(fèi)式數(shù)列 {
/**
* @author Helen
* Nov 21, 2014 10:30:46 AM
* @param args
* void
* TODO
*/
public static void main(String[] args) {
int n;
Scanner input=new Scanner(System.in);
System.out.println('請(qǐng)輸入N:');
n=input.nextInt();
input.close();
long t=System.currentTimeMillis();
cal(n);
System.out.println();
System.out.println('cal耗時(shí):'+(System.currentTimeMillis()-t));
t=System.currentTimeMillis();
for (int i = 1; i < n; i++) {
System.out.print(cal2(i)+',');
}
System.out.println();
System.out.println('cal2耗時(shí):'+(System.currentTimeMillis()-t));
}
public static void cal(int n){
int[] Fib=new int[n];
//f(n)=n,if n=0,n=1
Fib[0]=0;
Fib[1]=1;
//f(n)=f(n-1)+f(n-2),if n>=2
for (int i = 2; i < Fib.length; i++) {
Fib[i]=Fib[i-1]+Fib[i-2];
}
for (int i : Fib) {
System.out.print(i+',');
}
}
/**
*
* @author Helen
* Nov 21, 2014 11:13:56 AM
* @param n
* @return
* int
* TODO 遞歸(耗時(shí))
*/
public static int cal2(int n){
if(n==0||n==1){
return n;
}else{
return cal2(n-1)+cal2(n-2);
}
}
}
第一種是常規(guī)算法,每次都將計(jì)算后的數(shù)保存到一個(gè)數(shù)組里面,這樣在計(jì)算第N個(gè)數(shù)的時(shí)候就可以從數(shù)組里直接取出第N-1和第N-2的數(shù)了;
第二種遞歸算法是比較耗時(shí)的,可以看出第二種每次計(jì)算第N個(gè)數(shù)時(shí),它都要從第0(或1)個(gè)開始算起。
聯(lián)系客服