Последовательность Фибоначчи в C - PullRequest
0 голосов
/ 02 июля 2010

Это ожидаемый результат:

альтернативный текст http://i48.tinypic.com/f1lfuh.jpg

Мы должны создать программу на С, которая вычисляет последовательность Фибоначчи Нам разрешено только до 3 переменных, и нам НЕ разрешено использовать циклы. И я не знаю, что делать и как начать.

Надеюсь, вы, ребята, сможете мне помочь. : /

Ответы [ 7 ]

21 голосов
/ 02 июля 2010

При условии, что вы используете 32-битные целые числа без знака, 48-е число Фибоначчи вызовет целочисленное переполнение.Это делает вполне возможным использование справочной таблицы со всеми предварительно рассчитанными значениями (вручную).

17 голосов
/ 02 июля 2010

Использовать рекурсию:

alt text


Версия на языке C / C ++:

int fib(int a)
{
    if (a == 0) return 0;
    if (a == 1) return 1;
    return fib(a - 1) + fib(a - 2);
}

Применить предложение от этогоответить на комментарии:

Версия на языке C:

/*
 * -1 is a error handler
 */
int fib(int a)
{
    if (a < 0 || a > 47) return -1;
    if (a == 0) return 0;
    if (a == 1) return 1;
    return fib(a - 1) + fib(a - 2);
}

Версия на языке C ++:

int fib(int a)
{
    if (a < 0) throw new std::out_of_range("Fibonacci is not defined for negative sign values.");
    if (a > 47) throw new std::overflow_error("Fibonacci for this value was overflow the integer.");
    if (a == 0) return 0;
    if (a == 1) return 1;
    return fib(a - 1) + fib(a - 2);
}
7 голосов
/ 02 июля 2010

используйте http://www.research.att.com/~njas/sequences/b000045.txt в качестве файла данных;)

7 голосов
/ 02 июля 2010

Если циклы и рекурсия не разрешены, возьмите определение последовательности Фибоначчи и сделайте это вручную ... это смешно скучно и неинтересно, но это самое простое решение в этих ограничениях.

a = 0; // 0
b = 1; // 1
a = a + b; // 1
b = a + b; // 2
a = a + b; // 3
b = a + b; // 5

и так далее: b содержит n-е и a (n-1) -ое число.(Copy-paste a = a+b; b = a+b; сколько раз вам нужно ...) Разрешено копирование фрагментов кода?

... ( edit ) ...

Конечно, этот ответ просто показывает, какие нелепые вещи могут быть получены, если мы будем слишком сильно ограничивать свои права.Если вы не знаете рекурсию, вы должны изучать ее окончательно.Или придерживайтесь точной математики (как показывает другой ответ), но рекурсия является мощным инструментом, который программисты должны знать в любом случае, и рекурсивный подход более интуитивен, чем использование математических «уловок».

7 голосов
/ 02 июля 2010

Я подозреваю, что если вы не можете использовать циклы, то ваш профессор / учитель намеревался использовать рекурсию. В противном случае это просто вопрос поиска правильной формулы, которая не имеет смысла в классе программирования.

Если рекурсия разрешена, я настоятельно рекомендую прочитать это руководство (если вы с ним не знакомы).

4 голосов
/ 02 июля 2010

Поскольку цикл и рекурсия не разрешены,

int fib(int n) {
   int fk1 = 0, fk0 = 1;
main_sub3:
   fk1 += fk0;
   fk0 = fk1 - fk0;
   if (n > 0) {
     -- n;
     goto main_sub3;

& # X2A; раптор & # X2A;

4 голосов
/ 02 июля 2010

http://mathworld.wolfram.com/BinetsFibonacciNumberFormula.html

который вы можете скопировать здесь

http://cboard.cprogramming.com/cplusplus-programming/108426-binets-formula.html

long double f(short N) {
    double phi = (1+pow(5,0.5))/2;
    return ceil((pow(phi,N) - pow(1-phi,N))/pow(5,0.5));
}

конечно, это просто математика, но она вычисляет fib (N) без рекурсии и циклов ... вам все равно нужен способ вывести все значения для fib (1) .. fib (n), хотя

То, что хочет ваш учитель, - это, вероятно, рекурсия.

...