问题陈述:
Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。起始只有一只兔子,一个月后就有两只兔子,二个月后有三只兔子,三个月后有五只兔子(小兔投入生产)......。这就是Fibonacci数列,一般习惯称之为费氏数列,例如如下: 1 1 2 3 5 8 13 21 34 55 89.....
问题解法:
根据问题陈述,我们可以将费氏数列定义为一下:
F(n) = F(n-1) + F(n-2) if n > 1
F(n) = 1 if n = 0, 1
Fibonacci有两种最常见的解法,即迭代法和递归法。
代码详解:
1
/*
2
注:fibanacci数列下标从0开始
3
fibRecurse(int n) 递归计算数列下标为n的值
4
fibIterate(int n) 迭代计算数列下标为n的值
5
*/
6
#include <stdio.h>
7
#include <stdlib.h>
8
9
int
fibRecurse(
int
n);
10
int
fibIterate(
int
n);
11
12
int
main()
13
{
14
int
i, n;
15
printf(
"
Please input a number :
"
);
16
scanf(
"
%d
"
, &
n);
17
printf(
"
Recursion:\n
"
);
18
for
(i=
0
; i<n; i++
) {
19
printf(
"
%-5d
"
,fibRecurse(i));
20
if
((i+
1
)%
10
==
0
) {
21
printf(
"
\n
"
);
22
}
23
}
24
printf(
"
\n
"
);
25
printf(
"
Iteration:\n
"
);
26
for
(i=
0
; i<n; i++
) {
27
printf(
"
%-5d
"
,fibIterate(i));
28
if
((i+
1
)%
10
==
0
) {
29
printf(
"
\n
"
);
30
}
31
}
32
return
0
;
33
}
34
35
int
fibRecurse(
int
n) {
36
if
(n <
0
) {
37
return
-
1
;
38
}
39
if
(n==
0
|| n==
1
) {
40
return
1
;
41
}
else
{
42
return
fibRecurse(n-
1
) + fibRecurse(n-
2
);
43
}
44
}
45
46
int
fibIterate(
int
n) {
47
int
a =
1
, b =
1
, i, s;
48
if
(n <
0
) {
49
return
-
1
;
50
}
51
if
(n==
0
|| n==
1
) {
52
return
1
;
53
}
else
{
54
for
(i=
1
; i<n; i++
) {
55
s = a+
b;
56
a =
b;
57
b =
s;
58
}
59
}
60
return
s;
61
}

