[C++]斐波那契数列

本文详细介绍了斐波那契数列的概念及其数学定义,提供了递归和递推两种实现方式的代码示例,包括一般递归、记忆化搜索优化的递归以及递推实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斐波那契数列

斐波那契数列(意大利语:Successione di Fibonacci),又译为菲波拿契数列、菲波那西数列、斐波那契数列、黄金分割数列。

在数学上,斐波那契数列是以递归的方法来定义:

  • F0 = 0
  • F1 = 1
  • Fn = Fn-1 + Fn-2

用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。首几个费波那契系数是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……(OEIS中的数列A000045)

特别指出:0不是第一项,而是第零项。

程序代码

1. 递归实现

//一般递归实现方式
#include <iostream>
using namespace std;
inline int f(const int radix) {
	if (radix == 1 || radix == 2) return 1;
	else return f(radix - 1) + f(radix - 2);
};
int main(int argc, char *argv[]) {
	int n; cin >> n;
	cout << f(n) << endl; 
	return 0;
};
//记忆化搜索优化后的递归实现方式
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_SIZE = 1111;
int h[MAX_SIZE] = {};
inline int f(const int radix) {
	if (radix == 1 || radix == 2) return h[radix] = 1;
	if (h[radix]!= -1) return h[radix];
	else return h[radix] = f(radix - 1) +  f(radix - 2);
}; 
int main(int argc, char *argv[]) {
	memset(h, -1, sizeof h);
	int n; cin >> n;
	cout << f(n) << endl; 
	return 0;	
};

2. 递推实现

//一般递推实现方式
#include <iostream>
using namespace std;
const int MAX_SIZE = 1111;
int f[MAX_SIZE] = {0, 1, 1};
int main(int argc, char *argv[]) {
	for (int i = 3; i <= 1110; ++i)
		f[i] = f[i - 1] + f[i - 2];
	int n; cin >> n;
	cout << f[n] << endl;
	return 0;
};

引用

wikipedia

<think>我们被要求提供C++实现斐波那契数列的示例代码。根据引用,有递归和迭代(循环)两种主要方法。引用[1]和[2]展示了递归方法,但递归在n较大时效率低下(指数级时间复杂度)。引用[3]和[4]展示了迭代方法,迭代方法具有线性时间复杂度,效率更高。我们将提供两种方法的代码示例,并比较它们的优缺点。斐波那契数列定义:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2)(n>=2)注意:有些实现从0开始(F0=0,F1=1),有些从1开始(F1=1,F2=1)。我们这里采用从0开始:即第0项为0,第1项为1。1.递归实现(简单但效率低,适合小规模n)2.迭代实现(效率高,适合大规模n)同时,我们也要注意引用[4]中的迭代实现与引用[3]略有不同(引用[4]使用了不同的迭代方式,每次计算两项,但本质上都是迭代)。我们将按照常见的迭代方式(引用[3]的方式)来实现,因为更直观。另外,引用[4]的代码中,函数fibonacci_circulate的实现是针对从1开始的斐波那契数列(即第1项和第2项都是1),而且它返回第n项(n从1开始计数)。但为了统一,我们按照从0开始(第0项为0)来实现。我们提供两个函数:-递归函数:fib_recursive-迭代函数:fib_iterative并在main函数中让用户输入n,然后分别用两种方法计算并输出结果(注意:当n较大时,递归方法会很慢甚至栈溢出,所以我们会提醒用户递归方法适用于小n)。同时,我们也会考虑边界情况(n为负数的情况,我们这里假设n>=0)。代码结构:#include<iostream>usingnamespacestd;//递归实现longlongfib_recursive(intn){if(n<=0)return0;if(n==1)return1;returnfib_recursive(n-1)+fib_recursive(n-2);}//迭代实现longlongfib_iterative(intn){if(n<=0)return0;if(n==1)return1;longlonga=0,b=1;longlongresult;for(inti=2;i<=n;i++){result=a+b;a=b;b=result;}returnresult;}intmain(){intn;cout<<"请输入一个非负整数n:";cin>>n;if(n<0){cout<<"输入错误,请输入非负整数!"<<endl;return1;}//递归方法计算(注意:当n较大时,递归会很慢,所以这里我们限制n的大小,比如只对n<=40使用递归)cout<<"递归方法计算:";if(n>40){cout<<"n值较大,递归方法可能较慢,这里跳过递归计算。"<<endl;}else{cout<<"F("<<n<<")="<<fib_recursive(n)<<endl;}cout<<"迭代方法计算:";cout<<"F("<<n<<")="<<fib_iterative(n)<<endl;return0;}注意:我们使用longlong类型,因为斐波那契数列增长很快,避免整数溢出。但是,引用[4]中使用了另一种迭代方式,它每次计算两项,然后根据n的奇偶性返回。我们这里不采用那种方式,因为直接迭代更清晰。另外,我们可以在迭代方法中避免使用额外的result变量,但为了清晰,我们保留。我们也可以考虑动态规划(但迭代方法本质就是动态规划的空间优化版本)。根据用户要求,我们提供代码示例,并且生成相关问题。注意:在main函数中,我们对于较大的n(>40)跳过了递归计算,因为递归计算大n会非常慢。下面我们按照格式要求输出代码。</think>### C++ 实现斐波那契数列示例代码 斐波那契数列的定义为:$F(0) = 0, F(1) = 1$,且当 $n \geq 2$ 时满足递推关系 $F(n) = F(n-1) + F(n-2)$。以下是两种高效实现方式: #### 1. 迭代法(推荐) 时间复杂度 $O(n)$,空间复杂度 $O(1)$,适合计算大数值项: ```cpp #include <iostream> using namespace std; long long fibonacci(int n) { if (n <= 0) return 0; if (n == 1) return 1; long long a = 0, b = 1, result; for (int i = 2; i <= n; ++i) { result = a + b; // F(n)=F(n-1)+F(n-2) a = b; // 更新前两项值 b = result; } return result; } int main() { int n; cout << "请输入项数 n: "; cin >> n; cout << "F(" << n << ") = " << fibonacci(n) << endl; return 0; } ``` #### 2. 递归法(仅教学演示) 时间复杂度 $O(2^n)$,空间复杂度 $O(n)$,仅适用于小数值项: ```cpp #include <iostream> using namespace std; long long fibonacci(int n) { if (n <= 0) return 0; if (n == 1) return 1; return fibonacci(n-1) + fibonacci(n-2); } // 主函数同上 ``` ### 关键说明 1. **迭代法优势**: - 避免递归的指数级时间开销 - 支持计算 $n > 40$ 的项(递归法在 $n>40$ 时显著变慢) - 使用 `long long` 防止整数溢出($F(50) > 10^{10}$) 2. **注意事项**: - 当 $n > 93$ 时结果会溢出 `long long` 范围(最大值约 $9 \times 10^{18}$) - 输入负数时返回 0(根据数学定义 $F(n)=0$ 当 $n<0$) ### 性能对比 | 方法 | 计算 $F(40)$ 时间 | 最大可行 $n$ | |--------|-------------------|--------------| | 迭代法 | $\sim 1\mu s$ | $n \leq 93$ | | 递归法 | $\sim 1s$ | $n \leq 40$ | > 迭代法比递归法效率高百万倍以上[^3],实际应用务必使用迭代法[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值