Решить последовательность Фибоначчи Рекурсивно возвращая пустоту в функции

Мой профессор попросил нас написать программу, которая использует рекурсию для решения последовательности Фибоначчи. Это все довольно нормально, но он попросил нас сделать нашу функцию возвращаемой недействительной. Я работаю над этим уже несколько дней и не могу найти способ сделать это.

Я имею:

void fibonacci(double *n,double *x,double *y,double *result) {
     if(*n == 1)
          *result = 0;
     else if(*n == 2)
          *result = 1;
     else
          fibonacci(--n,n,(n-1),(n+(n-1))); }

Что я делаю правильно? Мне никогда раньше не приходилось использовать параметры таким образом, и я не уверен, что я на правильном пути. По какой-то причине он не компилируется при рекурсивном вызове fibonacci, сообщая о неверном добавлении указателя. Спасибо!

6 ответов

Решение

Поскольку это домашнее задание, я не буду предоставлять рабочий код, хотя здесь есть несколько моментов:

  1. Использовать ссылку проще, чем указатели
  2. Вам действительно нужно увеличить результат, а не устанавливать его в 0 или 1. Поэтому вам нужно перейти к первому вызову функции по ссылке int с присвоенным значением 0.
  3. Рассмотрим формулу: f(n) = f(n-1) + f(n-2) для всех n > 2; f(n) = 0 для n=1 и f(n) = 1 для n=2.

Подсказка: проблема есть: fibonacci(--n,n,(n-1),(n+(n-1))); или даже просто там --n, Вы работаете с указателями

Компилятор прав. Вам нужно разыменовать указатели в вызове, если вы используете указатели.

Но более простым решением было бы использовать этот прототип (и сопоставить весь код с ним):

void fibonacci(int n, int *result).
  • Я заменил double на int, потому что не понимаю, почему вы используете double для хранения целых чисел.
  • Я удалил x и y, которые вы не используете в своей функции.

Используйте это для начала:

void fibonacci(double n, double & result) {
    if(n == 1)
        result = 0;
    else if(n == 2)
        result = 1;
    else {
        // gotta figure that part out yourself
    }
}

Объявив result в качестве ссылки, ваша модификация изменит значение фактического переданного параметра. Поскольку это C++, ссылки должны быть предпочтительными. Вы все еще можете объявить n как нормальное значение, потому что вы не хотите изменять его. Теперь рекурсивный вызов - твоя домашняя работа:)

Я думаю, что это должно быть так:

void fibonacci_list()
{
   int count,next=1,prev1=0,prev2;
   printf("1");
   for(count=2;count<=12;count++)
   {
       prev2=prev1;
       prev1=next;
       next=prev1+prev2;
       printf("%d ",next);
   }
   printf("...");
   return;
}

Нет. Во-первых, вы вычитаете указатели для плавания (в --n), что может легко (даже если вы скомпилируете и запустите) нарушение доступа. Правильно жалуется хоть на типы. Типы, которые принимает функция, являются указателями, и я уверен, что вы передаете float.

Другие вопросы по тегам