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; }