C++ 错误C2106:&x27=';:通过C+中的动态规划,左操作数必须是斐波那契序列中的l值+;
我正试图编写一个程序,用动态规划方法生成斐波那契序列,如下所示C++ 错误C2106:&x27=';:通过C+中的动态规划,左操作数必须是斐波那契序列中的l值+;,c++,fibonacci,lvalue,C++,Fibonacci,Lvalue,我正试图编写一个程序,用动态规划方法生成斐波那契序列,如下所示 #include<iostream> #include<ctime> int fib(int index) { int memo[] = {0}; memo[0] = 0; memo[1] = 1; for(int i = 2; i <= index; i++) { fib(index) = fib(index - 1) + fib(index
#include<iostream>
#include<ctime>
int fib(int index)
{
int memo[] = {0};
memo[0] = 0;
memo[1] = 1;
for(int i = 2; i <= index; i++)
{
fib(index) = fib(index - 1) + fib(index - 2); //error comes here
}
return fib(index);
}
int main()
{
time_t start, end, diff;
int index;
std::cout << "Please, enter the index of fibonacci sequence" << std::endl;
std::cin >> index;
start = time(NULL);
std::cout << "calculating...." << std::endl << fib(index) <<std::endl;
end = time(NULL);
diff = (time_t)difftime(end, start);
std::cout << "Time elapsed: " << diff << std::endl;
return 0;
}
所以,请告诉我我在这方面做了什么错事。提前感谢。您正在分配一个l值(这是
int fib(int)
返回的值)。就像错误消息所说的那样
还要注意,
intmemo[]={0}
创建一个大小为1
的数组,因此在索引0
之外写入是无效的。您正在分配一个l值(这是int fib(int)
返回的值)。就像错误消息所说的那样
还要注意,
intmemo[]={0}
创建一个大小为1
的数组,因此在索引0
之外写入是无效的。您不能像其他人指出的那样分配给fib(index)
。通过返回引用或指针可以解决问题
但是程序本身是错误的,因为它进入了无限循环。线路
fib(index) = fib(index - 1) + fib(index - 2);
如果索引>1,则继续启动fib(索引)。使用DP求解斐波那契的正确方法是
int fib(int n)
{
int a = 0, b = 1, c, i;
if( n == 0)
return a;
for (i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return b;
}
intfib(intn)
{
int a=0,b=1,c,i;
如果(n==0)
返回a;
对于(i=2;i您不能像其他人已经指出的那样分配到fib(index)
。通过返回引用或指针可以解决问题
但是程序本身是错误的,因为它进入了无限循环
fib(index) = fib(index - 1) + fib(index - 2);
如果索引>1,则继续启动fib(索引)。使用DP求解斐波那契的正确方法是
int fib(int n)
{
int a = 0, b = 1, c, i;
if( n == 0)
return a;
for (i = 2; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return b;
}
intfib(intn)
{
int a=0,b=1,c,i;
如果(n==0)
返回a;
对于(i=2;i,必须引入如下临时变量:
int result = 0;
for(int i = 2; i <= index; i++)
{
result = fib(index - 1) + fib(index - 2); //error comes here
}
return result;
对于真正的动态解决方案,您可以将所有计算值存储到静态备忘录中,如果已经存在,则可以重用
int fib(int index)
{
// Stores fib for given index
static std::map<int, int> memo;
if (index == 0) return 0;
else if (index == 1) return 1;
else {
auto it = memo.find(index);
if (it == memo.end()) {
int r = fib(index - 1) + fib(index -2);
memo[index] = r;
} else return *it;
}
}
int-fib(int-index)
{
//存储给定索引的fib
静态标准::地图备忘录;
如果(索引==0)返回0;
如果(索引==1),则返回1;
否则{
auto it=memo.find(索引);
if(it==memo.end()){
intr=fib(指数-1)+fib(指数-2);
备忘录[索引]=r;
}否则就退回它;
}
}
必须引入如下临时变量:
int result = 0;
for(int i = 2; i <= index; i++)
{
result = fib(index - 1) + fib(index - 2); //error comes here
}
return result;
对于真正的动态解决方案,您可以将所有计算值存储到静态备忘录中,如果已经存在,则可以重用
int fib(int index)
{
// Stores fib for given index
static std::map<int, int> memo;
if (index == 0) return 0;
else if (index == 1) return 1;
else {
auto it = memo.find(index);
if (it == memo.end()) {
int r = fib(index - 1) + fib(index -2);
memo[index] = r;
} else return *it;
}
}
int-fib(int-index)
{
//存储给定索引的fib
静态标准::地图备忘录;
如果(索引==0)返回0;
如果(索引==1),则返回1;
否则{
auto it=memo.find(索引);
if(it==memo.end()){
intr=fib(指数-1)+fib(指数-2);
备忘录[索引]=r;
}否则就退回它;
}
}
可能应该有一个memo[index]而不是fib(index)不要分配给fib(index)
。可能应该有一个memo[index]而不是fib(index)不要分配给fib(index)
。嘿,谢谢。我把它修改为intmemo[]={}。但是,它返回了错误:<代码>错误C2466:不能分配一个常数大小为0的数组/代码> @ @ YVI,不能在C++中轻松调整数组大小。使用<代码> STD::向量< /代码>。不要使用裸数组,使用STD::矢量和备忘录〔0〕。=1;我使用了向量而不是数组。现在,程序正在成功编译;但它没有执行。它声明表达式:向量下标超出范围
。嘿,谢谢。我将其修改为int memo[]={}。但是,它返回了错误:<代码>错误C2466:不能分配一个常数大小为0的数组/代码> @ @ YVI,不能在C++中轻松调整数组大小。使用<代码> STD::向量< /代码>。不要使用裸数组,使用STD::矢量和备忘录〔0〕。=1;我使用了向量而不是数组。现在,程序正在成功编译;但它没有执行。它声明表达式:向量下标超出范围。我知道那种方法。但是,有人告诉我要通过有效地使用递归来生成斐波那契序列。@yuvi为什么不在问题中添加这个呢。如果你愿意的话使用递归如果你用std::vector
替换数组,那么你之前发布的内容会起作用。我知道那种方法。但是,我被告知要通过有效使用递归来生成斐波那契序列。@yuvi为什么不在你的问题中添加这个呢?如果你想使用递归,如果你用std::vector
您错过了开关盒的结束括号:p您错过了开关盒的结束括号:p