错误 C2106:'=':左操作数必须是斐波那契数列中的 l 值,方法是动态规划 C++

error C2106: '=' : left operand must be l-value in Fibonacci sequence by dynamic programming in C++

本文关键字:数列 方法 C++ 动态规划 C2106 操作数 错误      更新时间:2023-10-16

我试图通过动态编程方法编写一个程序来生成斐波那契序列。

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

,但是,在 fib(index) = fib(index - 1) + fib(index - 2);中,

会出现错误
error C2106: '=' : left operand must be l-value

所以,请告诉我我在那条线上做了什么。预先感谢。

您无法正如其他人指出的那样分配给fib(index)。通过返回参考或指针进行解决方法。

但是,该程序本身是错误的,因为它进入了无限的循环。线

fib(index) = fib(index - 1) + fib(index - 2);  

如果索引> 1.使用DP求解fibonacci的正确方法是

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

您必须引入这样的临时变量:

int result = 0;
for(int i = 2; i <= index; i++)
{
    result = fib(index - 1) + fib(index - 2);   //error comes here
}
return result;

这只是技术解决方案。正如Bala指出的那样,您的算法不起作用。

,如果您正在寻找递归的内容,这可能是一个解决方案:

int fib(int index)
{
    switch(index) {
    case 0:
        return 0;
    case 1:
        return 1;
    default:
        return fib(index - 1) + fib(index -1);
    }
}

对于真正的动态解决方案,您将所有计算值存储在静态备忘录中,并重复使用。

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

您正在分配给L值(int fib(int)返回)。就像错误消息所述。

还请注意,int memo[] = {0};创建了一个大小1的数组,因此编写索引 0是无效的。