##计算斐波那契数列的函数
#题目要求用递归方法,n取0--90,所有运算在30秒内完成
我写的代码运算花费的时间很长,大概在接近50的时候就开始超时了,如何优化一下?
#include <iostream>
using namespace std;
long long fibonacci[91]; //储存已经计算的数列
long long fibonacci_calculate(int n) {
if (n == 0) { fibonacci[0] = 0; return 0; }
if (n == 1) { fibonacci[1] = 1; return 1; }
if (n == 2) { fibonacci[2] = 1; return 1; }
else {
fibonacci[n] = fibonacci_calculate(n - 1)+fibonacci_calculate(n - 2);
return fibonacci[n];
}
}
//斐波那契数列的递归函数
int main() {
int ops=0; //储存到几的斐波那契数列
int n;
while (1) {
cin >> n; //当前要的项数
if (cin.fail()) { //输入的是char型,fail()函数会返回true,进入if
cin.clear();
cin.ignore();
cout << "WRONG" << endl;
}
else { //输入合法
if (n <= ops) { cout << fibonacci[n] << endl; } //n<ops直接提取
else {
cout << fibonacci_calculate(n) << endl;
ops = n;
}
//n>ops,计算斐波那契数列
}
}
return 0;
}
##问题在于迭代时 fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
这一语句块会使得函数递归分支,加倍递归运算
应只递归一次,把结果储存在数组中,每一次加数组中的数
#改正后代码
#include <iostream>
using namespace std;
long long fibonacci[91] = {0,1}; //初始化斐波那契数组
long long fibonacci_calculate(int n) {
if (n == 0) { return 0; }
if (n == 1) { return 1; }
else {
{
fibonacci[n] = fibonacci_calculate(n - 1) + fibonacci[n - 2];//这里进行优化,用数组中的数,不用递归两次
}
return fibonacci[n];
}
}
//斐波那契数列的递归函数
int main() {
int ops=0; //储存到几的斐波那契数列
int n;
while (1) {
cin >> n; //当前要的项数
if (cin.fail()) { //输入的是char型,fail()函数会返回true,进入if
cin.clear();
cin.ignore();
cout << "WRONG" << endl;
}
//如何判断小于90?
else { //输入合法
if (n <= ops) { cout << fibonacci[n] << endl; } //n<ops直接提取
else {
cout << fibonacci_calculate(n) << endl;
ops = n;
}
//n>ops,计算斐波那契数列
}
}
return 0;
}
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
你的代码使用了递归来计算斐波那契数列,这种方法的时间复杂度是O(2^n),当n较大时,计算速度会非常慢。为了优化这个问题,你可以使用动态规划的方法来降低时间复杂度。
动态规划的思想是将已经计算过的斐波那契数列项存储起来,避免重复计算。这样,在计算第n个斐波那契数时,只需要计算前两个斐波那契数,然后相加即可。这样的时间复杂度为O(n)。
下面是使用动态规划优化后的代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
vector<long long> fibonacci(91, 0); // 初始化斐波那契数列数组
fibonacci[0] = 0;
fibonacci[1] = 1;
while (cin >> n) { // 输入要计算的斐波那契数列项数
if (cin.fail()) {
cin.clear();
cin.ignore();
cout << "WRONG" << endl;
} else {
if (n <= 87) { // 当n小于等于87时,直接从数组中提取斐波那契数列项
cout << fibonacci[n] << endl;
} else { // 当n大于87时,计算斐波那契数列项并输出
long long result = fibonacci[86] + fibonacci[85];
cout << result << endl;
}
}
}
return 0;
}
这样修改后,你的代码应该可以在30秒内完成所有运算。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
主要是重复计算太多
#include <iostream>
using namespace std;
long long fibonacci[91] = {0, 1, 1}; // 储存已经计算的数列
auto fibonacci_calculate(int n) -> long long
{
if (n < 3)
{
return fibonacci[n];
}
if (fibonacci[n] != 0)
{
return fibonacci[n];
}
fibonacci[n] = fibonacci_calculate(n - 1) + fibonacci_calculate(n - 2);
return fibonacci[n];
}
// 斐波那契数列的递归函数
int main()
{
int ops = 0; // 储存到几的斐波那契数列
int n;
while (1)
{
cin >> n; // 当前要的项数
if (cin.fail())
{ // 输入的是char型,fail()函数会返回true,进入if
cin.clear();
cin.ignore();
cout << "WRONG" << endl;
}
else
{ // 输入合法
if (n <= ops)
{
cout << fibonacci[n] << endl;
} // n<ops直接提取
else
{
cout << fibonacci_calculate(n) << endl;
ops = n;
}
// n>ops,计算斐波那契数列
}
}
return 0;
}
【以下回答由 GPT 生成】
这段代码中,递归算法实现斐波那契数列计算。由于递归的性质,在计算较大的数列时会频繁调用递归函数,导致计算时间过长从而超时。
要优化这个递归算法,可以使用迭代方法来计算斐波那契数列。迭代方法只需要使用两个变量来存储前两个数,然后依次更新这两个变量来计算后面的数,避免了频繁的函数调用。
下面是优化后的代码:
#include <iostream>
using namespace std;
long long fibonacci[91]; //储存已经计算的数列
long long fibonacci_calculate(int n) {
fibonacci[0] = 0; // F(0) = 0
fibonacci[1] = 1; // F(1) = 1
for (int i = 2; i <= n; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
return fibonacci[n];
}
int main() {
int ops = 0; //储存到几的斐波那契数列
int n;
while (1) {
cin >> n; //当前要的项数
if (cin.fail()) { //输入的是char型,fail()函数会返回true,进入if
cin.clear();
cin.ignore();
cout << "WRONG" << endl;
}
else { //输入合法
if (n <= ops) {
cout << fibonacci[n] << endl;
} //n<=ops直接提取
else {
cout << fibonacci_calculate(n) << endl;
ops = n;
}
//n>ops,计算斐波那契数列
}
}
return 0;
}
这段代码使用迭代方法计算斐波那契数列,将每个计算结果存储在fibonacci
数组中,避免了递归调用。在计算新的项时,直接使用已经计算好的前两个数来计算,而不需要重新计算整个数列。
【相关推荐】