1、斐波那契數列:
又稱黃金分割數列,指的是這樣一個數列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),
即這個數列從第二項開始,每一項都等於前兩項之和
特別指出:0是第0項,不是第1項
2、遞歸算法:
說明:程序調用自身的編程技巧稱為遞歸( recursion)。
一個過程或函數在其定義或說明中又直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
注意:
(1) 遞歸就是在過程或函數里調用自身;
(2) 在使用遞增歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
(1)用遞歸法求斐波那契數列並列出所有項:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include<stdio.h>
int fun( int n) //n代表第幾項。特別指出:0是第0項,不是第1項。
{
if (n <= 1 ) //終止條件//
return n;
else
return fun(n- 1 ) + fun(n- 2 );
}
int main()
{
int n;
printf( "請輸入要輸出多少項(自然數)斐波那契數列:" );
scanf( "%d" ,&n);
//int *a = (int *)malloc((n+1)*sizeof(int));//如需存儲,使用動態內存分配n+1個空間進行存儲
int i;
for (i = 0 ; i < n+ 1 ; i++) //輸出所有項
{
printf( "%d, " , fun(i));
if (i != 0 && i% 5 == 0 ) //每五項進行一次換行(第一行多一個第0項)
printf( "\n" );
}
printf( "第 %d 項是:%d\n" , n, fun(n)); //輸出要求的項
return 0 ;
}
|
(2)用非遞歸算法實現:
#include<stdio.h>
int main()
{
int f[20]={1,1},i;
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
for(i=0;i<20;i++)
{
printf("%d\t",f[i]);
if((i+1)%5==0) //輸出5個數換行//
printf("\n");
}
getchar();//起延時作用 getchar是一個字符輸入函數 只能接收一個字符 與之對應的是putchar 用於輸出一個字符//
return 0;
}