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