C语言设计并实现四种求解斐波那契数列的算法, 并用计时法测量算法的运行时间
时间: 2024-09-19 21:12:45 浏览: 84
C语言中可以使用多种方法求解斐波那契数列,这里我会介绍常见的递归、循环迭代、矩阵快速幂和动态规划四种方法,并给出简单的示例代码以及运行时间测量。
**1. 递归方法:**
```c
#include <stdio.h>
#include <time.h>
long long fib_recursive(int n) {
if (n <= 1)
return n;
else
return fib_recursive(n - 1) + fib_recursive(n - 2);
}
int main() {
int n = 50; // 测试值
clock_t start = clock();
printf("%lld\n", fib_recursive(n));
clock_t end = clock();
double elapsed_time = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("Time taken for recursion: %f seconds.\n", elapsed_time);
return 0;
}
```
相关问题
C语言设计并实现四种求解斐波那契数列的算法,并用计时法测量算法的运行时间
斐波那契数列是一个经典的递归序列,前两个数通常为0和1,后面的每个数字都是前两个数字之和。在C语言中,可以设计多种求解斐波那契数列的算法,包括递归、动态规划、矩阵快速幂以及迭代等。
以下是四种常见的算法示例:
1. **递归法**(效率较低)
```c
#include <stdio.h>
long long fib(int n) {
if (n <= 1)
return n;
else
return fib(n - 1) + fib(n - 2);
}
```
2. **动态规划**(效率较高)
```c
#include <stdio.h>
long long fib(int n) {
int dp[n+1];
dp[0] = 0;
dp[1] = 1;
for (int i=2; i<=n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
```
3. **矩阵快速幂**(效率最高)
```c
#include <stdio.h>
void multiply(long long F[2][2], long long M[2][2]) {
long long x = F[0][0]*M[0][0] + F[0][1]*M[1][0];
long long y = F[0][0]*M[0][1] + F[0][1]*M[1][1];
long long z = F[1][0]*M[0][0] + F[1][1]*M[1][0];
long long w = F[1][0]*M[0][1] + F[1][1]*M[1][1];
F[0][0] = x;
F[0][1] = y;
F[1][0] = z;
F[1][1] = w;
}
void power(long long F[2][2], int n) {
if (n == 1)
return;
long long M[2][2] = {{1, 1}, {1, 0}};
power(F, n/2);
multiply(F, F);
if (n % 2 != 0)
multiply(F, M);
}
long long fib(int n) {
if (n <= 1)
return n;
long long F[2][2] = {{1, 1}, {1, 0}};
power(F, n - 1);
return F[0][0];
}
```
4. **迭代法**
```c
#include <stdio.h>
long long fib(int n) {
long long a = 0, b = 1, c = 0;
if (n == 0)
return a;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
```
为了测量算法的运行时间,你可以使用`<time.h>`库中的`clock()`函数或者更准确的`chrono`模块,在每次计算完一个斐波那契数后记录当前时间,然后减去开始的时间,得到耗时。
设计并实现四种求解斐波那契数列的算法,用计时法测量算法的运行时间,写出c语言代码
设计和实现斐波那契数列的算法有很多种,这里我会提供四种常见的方法:
1. **迭代法** - 使用循环结构直接计算当前项的值,不需要记忆历史数据。
```c
#include <stdio.h>
#include <time.h>
long fib_iterative(int n) {
if (n <= 0)
return 0;
else if (n == 1 || n == 2)
return 1;
long fib = 1, prev = 1;
for (int i = 3; i <= n; i++) {
fib = prev + fib;
prev = fib;
}
return fib;
}
void measure_time(const char* method_name, int n) {
clock_t start = clock();
long result = fib_iterative(n);
clock_t end = clock();
double time_spent = ((double)(end - start)) / CLOCKS_PER_SEC;
printf("%s(%d): %ld (Time taken: %.6f seconds)\n", method_name, n, result, time_spent);
}
```
2. **递归法** - 简单但效率较低,因为存在大量的重复计算。
```c
long fib_recursive(int n) {
if (n <= 0)
return 0;
else if (n == 1)
return 1;
else
return fib_recursive(n - 1) + fib_recursive(n - 2);
}
// 仅用于演示,实际应用中递归会非常慢
void measure_time_recursion(const char* method_name, int n) {
measure_time(method_name, n);
}
```
3. **动态规划优化的递推法** - 通过存储中间结果避免重复计算。
```c
#define MAX_FIB 100
long fib_dynamic(int n) {
static long fib[MAX_FIB] = {0};
if (n <= 0)
return 0;
if (fib[n] != 0)
return fib[n];
fib[n] = fib_recursive(n);
return fib[n];
}
```
4. **矩阵快速幂法** - 利用矩阵乘法的性质加速递推过程,适合大数情况。
```c
#include <math.h>
const int matrix_size = 2;
typedef long long Matrix[matrix_size][matrix_size];
Matrix multiply(Matrix a, Matrix b) {
Matrix c;
for (int i = 0; i < matrix_size; i++)
for (int j = 0; j < matrix_size; j++)
c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j];
return c;
}
Matrix power(Matrix base, int exponent) {
Matrix result = {{1, 1}, {1, 0}};
while (exponent > 0) {
if (exponent % 2)
result = multiply(result, base);
base = multiply(base, base);
exponent /= 2;
}
return result;
}
long fib_matrix(int n) {
Matrix identity = {{1, 1}, {1, 0}};
if (n <= 0)
return 0;
Matrix result = power(identity, n - 1);
return result[0][0];
}
void measure_time_matrix(const char* method_name, int n) {
measure_time(method_name, n);
}
```
要测量每个算法的时间,你可以分别调用 `measure_time` 函数,传入算法名称和需要计算的斐波那契数。请注意,由于递归法在较大数值下运行很慢,对大数的测量通常只适用于迭代、动态规划和矩阵快速幂方法。
阅读全文