Проблема с функцией фибоначчи. С++

Должно возвращать место n массива. Но вместо значения я получаю только 0.

int fibonacci(int n)
{
 int f[100];
 f[0] = 0;
 f[1] = 1;
 for (int i=2; i
<p>Новый КОД:</p> <p>Новая проблема, возвращающая одно число дальше, а затем должна. Например, если "n == 7", то его возвращение "13" не "8", как это должно быть.</p> <pre class="prettyprint linenums">int fibonacci(int n) { int f[100] = { 0, 1 }; for (int i=2; i&lt;=n; i++) { f[i] = f[i-2] + f[i-1]; } return f[n-1]; } int main() { cout &lt;&lt; fibonacci(7); return 0; }</pre>
7 ответов

ну, вы никогда не устанавливаете f[n], вы переходите только к i < n, то есть i == n-1. попробуйте вернуть f[n-1]

РЕДАКТИРОВАТЬ: как сказал Крис Лутц, мой ответ не подходит, поскольку он дал бы недействительный результат, если вы позвонили fibonacci(0)

Как многие уже ответили, лучшим решением является цикл до i <= n Если, конечно, вы не хотите, чтобы fibonacci(3) возвращал 3-й элемент в последовательности фибоначчи, а не 4-й, и в этом случае fibonacci(0) не имеет смысла, а правильное возвращаемое значение будет f[n-1]... все-таки дело n==0 должно быть обработано каким-то образом, как и случаи n<0 и n>100.

вы можете вернуть f[n-1], пока вы проверяете правильные границы:

int fibonacci(int n)
{
 int f[100] = { 0, 1 };
 if ((n <= 0) || (n > 100))
 return -1;//return some invalid number to tell the caller that he used bad input
 for (int i=2; i < n; i++) // you can use i < n here
 {
 f[i] = f[i-2] + f[i-1];
 }
 return f[n-1];
}


Ваше условие завершения цикла неверно. Так как это домашнее задание, возможно, вы можете понять, почему.


Вы забыли инициализировать n-ое значение массива. Вы возвращаете f [n], но только инициализируетесь до n-1.


Проблема в том, что вы тестируете i < n (где n == 3 в вызове вашего примера), но вы возвращаете f[3], который не настроен ни на что. Вам повезло, что вы получаете нули, а не случайный мусор.

Измените "<" на "<=" .

Рабочий код # 1

Сохранение массива полного размера.

#include <iostream>
using namespace std;
static int fibonacci(int n)
{
 int f[100] = { 0, 1 };
 if (n < 0 || n > 100)
 return -1;
 else if (n < 2)
 return f[n];
 for (int i = 2; i <= n; i++)
 {
 f[i] = f[i-2] + f[i-1];
 //cout << "f[" << i << "] = " << f[i] << endl;
 }
 return f[n];
}
int main()
{
 for (int i = 0; i < 8; i++)
 cout << "fib(" << i << ") = " << fibonacci(i) << endl;
 return 0;
}
</iostream>

Результат вывода # 1

fib(0) = 0
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
fib(5) = 5
fib(6) = 8
fib(7) = 13

Рабочий код # 2

Это использует массив размером 3, за счет большого количества операций по модулю:

#include <iostream>
using namespace std;
static int fibonacci(int n)
{
 int f[3] = { 0, 1, 0 };
 if (n < 0 || n > 100)
 return -1;
 else if (n < 2)
 return f[n];
 for (int i = 2; i <= n; i++)
 {
 f[i%3] = f[(i-2)%3] + f[(i-1)%3];
 //cout << "f[" << i << "] = " << f[i%3] << endl;
 }
 return f[n%3];
}
int main()
{
 for (int i = 0; i < 8; i++)
 cout << "fib(" << i << ") = " << fibonacci(i) << endl;
 return 0;
}
</iostream>

Он производит тот же вывод - поэтому нет смысла его повторять.

Рабочий код № 3

Избегайте массивов и операций по модулю:

#include <iostream>
using namespace std;
static int fibonacci(int n)
{
 int f0 = 0;
 int f1 = 1;
 if (n < 0 || n > 46)
 return -1;
 else if (n == 0)
 return f0;
 else if (n == 1)
 return f1;
 int fn;
 for (int i = 2; i <= n; i++)
 {
 int fn = f0 + f1;
 f0 = f1;
 f1 = fn;
 //cout << "f[" << i << "] = " << fn << endl;
 }
 return f1;
}
int main()
{
 for (int i = -2; i < 50; i++)
 cout << "fib(" << i << ") = " << fibonacci(i) << endl;
 return 0;
}
</iostream>

Предел 46 эмпирически определяется как правильный для 32-разрядных целых чисел.

Результат # 3

fib(-2) = -1
fib(-1) = -1
fib(0) = 0
fib(1) = 1
fib(2) = 1
fib(3) = 2
fib(4) = 3
fib(5) = 5
fib(6) = 8
fib(7) = 13
fib(8) = 21
fib(9) = 34
fib(10) = 55
fib(11) = 89
fib(12) = 144
fib(13) = 233
fib(14) = 377
fib(15) = 610
fib(16) = 987
fib(17) = 1597
fib(18) = 2584
fib(19) = 4181
fib(20) = 6765
fib(21) = 10946
fib(22) = 17711
fib(23) = 28657
fib(24) = 46368
fib(25) = 75025
fib(26) = 121393
fib(27) = 196418
fib(28) = 317811
fib(29) = 514229
fib(30) = 832040
fib(31) = 1346269
fib(32) = 2178309
fib(33) = 3524578
fib(34) = 5702887
fib(35) = 9227465
fib(36) = 14930352
fib(37) = 24157817
fib(38) = 39088169
fib(39) = 63245986
fib(40) = 102334155
fib(41) = 165580141
fib(42) = 267914296
fib(43) = 433494437
fib(44) = 701408733
fib(45) = 1134903170
fib(46) = 1836311903
fib(47) = -1
fib(48) = -1
fib(49) = -1


n - это индекс, который никогда не был достигнут в вашей версии. Вам просто нужно заменить < на <= в вашем условном выражении for. (Вы никогда не назначали f [n], потому что n никогда не достигалось циклом, и поэтому вы вернули значение по умолчанию.)

int fibonacci(int n) { int f[100]; f[0] = 0; f[1] = 1; for (int i=2; i<=n; i++) { f[i]=f[i-2] + f[i-1]; } return f[n]; } int main() { cout << fibonacci(3); return 0; }

И вам, кстати, не нужен массив для выполнения последовательности фидов. Просто используйте две переменные и переназначьте их в цикле. Что-то вроде этого:

int a = 0;
int b = 1;
for (int i=2; i<=n; i++)
{
 b = a + b;
 a = b;
}
return b;


При вызове fibonacci(3) ваш цикл for (внутри функции фибоначчи) продолжается до i < 3...

Это означает, что последний присваивание f[2]. Не f[3], как ожидалось (это значение, которое вы возвращаете).


Разве вы не имеете в виду return f [n-1];

Я думаю, ваш компилятор установил массив f [100] равным 0?

Похоже, что у другого парня есть правильный ответ....

licensed under cc by-sa 3.0 with attribution.