递归是一种在函数定义中使用函数自身的方法。在计算斐波那契数列时,递归方法通过定义基本情况(如第0项和第1项)和递归关系(每一项是前两项之和)来实现。

1、基本递归法

最基本的递归方法,通过直接递归计算第 n 项斐波那契数。

#include <stdio.h>

// 基本递归法计算斐波那契数列第 n 项
int fibonacci(int n) {
    if (n <= 1)
        return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    int n;
    printf("Enter the value of n: ");
    scanf("%d", &n);
    printf("Fibonacci number at position %d is %d\n", n, fibonacci(n));
    return 0;
}

2、带缓存的递归法(Memoization)

使用数组缓存已经计算过的斐波那契数,减少重复计算,提升性能。

#include <stdio.h>

// 全局数组,用于缓存已经计算的斐波那契数
int memo[1000];

// 带缓存的递归法计算斐波那契数列第 n 项
int fibonacci(int n) {
    if (n <= 1)
        return n;
    if (memo[n] != -1)  // 如果缓存中已经有结果,直接返回
        return memo[n];
    memo[n] = fibonacci(n - 1) + fibonacci(n - 2);  // 递归计算并缓存结果
    return memo[n];
}

int main() {
    int n;
    printf("Enter the value of n: ");
    scanf("%d", &n);

    // 初始化缓存数组
    for (int i = 0; i <= n; i++)
        memo[i] = -1;

    printf("Fibonacci number at position %d is %d\n", n, fibonacci(n));
    return 0;
}

3、尾递归优化法

尾递归是一种优化递归方法,通过将递归调用放在函数的最后一步,可以优化递归的内存使用。

#include <stdio.h>

// 尾递归优化法计算斐波那契数列第 n 项
int fibonacciTailRecursion(int n, int a, int b) {
    if (n == 0)
        return a;
    if (n == 1)
        return b;
    return fibonacciTailRecursion(n - 1, b, a + b);
}

int fibonacci(int n) {
    return fibonacciTailRecursion(n, 0, 1);
}

int main() {
    int n;
    printf("Enter the value of n: ");
    scanf("%d", &n);
    printf("Fibonacci number at position %d is %d\n", n, fibonacci(n));
    return 0;
}

4、 矩阵快速幂法

使用矩阵快速幂来计算斐波那契数,效率更高。

#include <stdio.h>

void multiply(int F[2][2], int M[2][2]) {
    int x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
    int y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
    int z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
    int 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(int F[2][2], int n) {
    if (n == 0 || n == 1)
        return;

    int M[2][2] = {{1, 1}, {1, 0}};

    power(F, n / 2);
    multiply(F, F);

    if (n % 2 != 0)
        multiply(F, M);
}

int fibonacci(int n) {
    if (n == 0)
        return 0;

    int F[2][2] = {{1, 1}, {1, 0}};
    power(F, n - 1);
    
    return F[0][0];
}

int main() {
    int n;
    printf("Enter the position of Fibonacci sequence: ");
    scanf("%d", &n);
    printf("Fibonacci number at position %d is %d\n", n, fibonacci(n));
    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表