Решить последовательность Фибоначчи Рекурсивно возвращая пустоту в функции - PullRequest
1 голос
/ 23 сентября 2010

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

У меня есть:

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

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

Ответы [ 6 ]

4 голосов
/ 23 сентября 2010

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

3 голосов
/ 23 сентября 2010

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

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

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

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

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;
}
0 голосов
/ 23 сентября 2010

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

  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.
0 голосов
/ 23 сентября 2010

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

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 как нормальное значение, потому что вы не хотите его изменять.Теперь рекурсивный вызов - ваша домашняя работа:)

0 голосов
/ 23 сентября 2010

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

...