斐波那契数是以下整数序列中的数字。
0,1,1,2,3,5,8,13,21,34,55,89,144,……..
用数学术语来说,斐波纳契数的序列Fn由递归关系定义
Fn = Fn-1 + Fn-2
具有种子值
F0 = 0 and F1 = 1.
C
// Fibonacci Series using Recursion
#include
int fib(int n)
{
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
int main()
{
int n = 9;
printf("%d", fib(n));
getchar();
return 0;
}
C
// Fibonacci Series using Dynamic Programming
#include
int fib(int n)
{
/* Declare an array to store Fibonacci numbers. */
int f[n + 1];
int i;
/* 0th and 1st number of the series are 0 and 1*/
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++) {
/* Add the previous 2 numbers in the series
and store it */
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
int main()
{
int n = 9;
printf("%d", fib(n));
getchar();
return 0;
}
C/C++
// Fibonacci Series using Space Optimized Method
#include
int fib(int n)
{
int a = 0, b = 1, c, i;
if (n == 0)
return a;
for (i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
int main()
{
int n = 9;
printf("%d", fib(n));
getchar();
return 0;
}
输出:
34
时间复杂度: T(n)= T(n-1)+ T(n-2)是指数的。
我们可以观察到该实现做了很多重复的工作(请参见下面的递归树)。因此,对于第n个斐波那契数,这是一个错误的实现。
fib(5)
/
fib(4) fib(3)
/ /
fib(3) fib(2) fib(2) fib(1)
/ / /
fib(2) fib(1) fib(1) fib(0) fib(1) fib(0)
/
fib(1) fib(0)
额外空间:如果考虑函数调用堆栈的大小,则为O(n),否则为O(1)。
方法2(使用动态编程)
通过存储到目前为止计算出的斐波那契数,我们可以避免方法1的重复工作。
C
// Fibonacci Series using Dynamic Programming
#include
int fib(int n)
{
/* Declare an array to store Fibonacci numbers. */
int f[n + 1];
int i;
/* 0th and 1st number of the series are 0 and 1*/
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++) {
/* Add the previous 2 numbers in the series
and store it */
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
int main()
{
int n = 9;
printf("%d", fib(n));
getchar();
return 0;
}
输出:
34
时间复杂度: O(n)
额外空间: O(n)
方法3(空间优化方法2)
我们只能通过存储前两个数字来优化方法2中使用的空间,因为这是我们获取序列中下一个斐波纳契数所需要的全部。
C / C++
// Fibonacci Series using Space Optimized Method
#include
int fib(int n)
{
int a = 0, b = 1, c, i;
if (n == 0)
return a;
for (i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
int main()
{
int n = 9;
printf("%d", fib(n));
getchar();
return 0;
}
输出:
34
请参阅有关斐波那契数字的程序的完整文章,以了解更多详细信息!
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。