Решить последовательность Фибоначчи Рекурсивно возвращая пустоту в функции
Мой профессор попросил нас написать программу, которая использует рекурсию для решения последовательности Фибоначчи. Это все довольно нормально, но он попросил нас сделать нашу функцию возвращаемой недействительной. Я работаю над этим уже несколько дней и не могу найти способ сделать это.
Я имею:
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 ответов
Поскольку это домашнее задание, я не буду предоставлять рабочий код, хотя здесь есть несколько моментов:
- Использовать ссылку проще, чем указатели
- Вам действительно нужно увеличить результат, а не устанавливать его в 0 или 1. Поэтому вам нужно перейти к первому вызову функции по ссылке int с присвоенным значением 0.
- Рассмотрим формулу: 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.