ошибка C2106: '=': левый операнд должен быть l-значением в последовательности Фибоначчи при динамическом программировании на C ++

0

Я пытаюсь написать программу для генерации последовательности Фибоначчи методом динамического программирования следующим образом.

#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

Итак, скажите, пожалуйста, что я сделал в этой строке. Заранее спасибо.

  • 0
    Вероятно, должна быть памятка [index] вместо fib (index)
  • 0
    Не назначайте на fib(index) .
Теги:
fibonacci
lvalue

3 ответа

1
Лучший ответ

Вы назначаете l-значение (это то, что возвращает int fib(int)). Так же, как и сообщение об ошибке.

Также обратите внимание, что int memo[] = {0}; создает массив размером 1, поэтому запись за пределами индекса 0 является недопустимой.

  • 0
    Эй спасибо Я изменил это на int memo[] = {} . Но затем он вернул ошибку, что error C2466: cannot allocate an array of constant size 0 .
  • 1
    @yuvi, вы не можете легко изменить размеры массивов в C ++. Используйте std::vector .
Показать ещё 3 комментария
2

Вы должны ввести временную переменную следующим образом:

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)
{
    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;
    }
}
  • 0
    Вы пропустили закрывающую скобку для распределительного шкафа: p
  • 0
    @ Бала: Хорошо, исправлено, спасибо.
2

Вы не можете назначить fib(index) как уже указывали другие. Существует обходное решение, возвращая ссылку или указатель.

Но сама программа ошибочна, поскольку она переходит в бесконечный цикл. Линия

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

Сохраняет исходный фид (индекс), если индекс> 1. Правильный способ решения Фибоначчи с использованием 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;
}
  • 0
    Я знаю этот метод. Но мне сказали генерировать последовательность Фибоначчи путем эффективного использования рекурсии.
  • 0
    @yuvi Почему бы тебе не добавить это в свой вопрос? Если вы хотите использовать рекурсию, то, что вы опубликовали ранее, будет работать, если вы замените массив на std::vector

Ещё вопросы

Сообщество Overcoder
Наверх
Меню