1、斐波那契数列
2、变化规律
3、递归实现
#include <stdio.h>
// 递归方式计算斐波那契数
int fibonacci_recursive(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
}
int main() {
int n;
printf("输入一个数字: ");
scanf("%d", &n);
printf("斐波那契数列第 %d 项是: %d\n", n, fibonacci_recursive(n));
return 0;
}
4、非递归实现
#include <stdio.h>
// 非递归方式计算斐波那契数
int fibonacci_non_recursive(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
int a = 0, b = 1, fib;
for (int i = 2; i <= n; ++i) {
fib = a + b;
a = b;
b = fib;
}
return fib;
}
int main() {
int n;
printf("输入一个数字: ");
scanf("%d", &n);
printf("斐波那契数列第 %d 项是: %d\n", n, fibonacci_non_recursive(n));
return 0;
}
5、时间复杂度分析
5.1、递归实现
- 对于每一个
n
,函数fibonacci_recursive(n)
会调用两次自身:fibonacci_recursive(n - 1)
和fibonacci_recursive(n - 2)
。- 这意味着,对于每一个
n
,计算时间是T(n) = T(n-1) + T(n-2)
。- 这种递归关系类似于斐波那契数列本身,时间复杂度可以表示为
O(2^n)
,因为每层递归分成两个分支,形成一个二叉树,树的高度为n
。因此,递归算法的时间复杂度是
O(2^n)
,为指数级别。
5.2、非递归实现
- 该算法使用一个循环从2循环到
n
,每次迭代执行常数时间的操作。- 循环运行了
n - 1
次(从2到n
),因此时间复杂度是O(n)
。因此,非递归算法的时间复杂度是
O(n)
,为线性级别。