Как это исправить, чтобы написать программу, которая использует циклы while для вычисления первых n чисел Фибоначчи - PullRequest
1 голос
/ 28 сентября 2011

Я новичок в программировании на C ++ и немного растерялся.Вот что я должен делать и мой код.Любые идеи о том, что делать?

Напишите программу, которая использует циклы while для вычисления первых n чисел Фибоначчи.Напомним из математики следующее определение последовательности Фибоначчи:

Числа Фибоначчи Fn определяются следующим образом.F0 равно 1, F1 равно 1 и Fi + 2 = Fi + Fi + 1 для i = 0, 1, 2, ....Другими словами, каждое число является суммой двух предыдущих чисел.Первые несколько чисел Фибоначчи - 1, 1, 2, 3, 5, 8 и 13.

Программа должна запросить у пользователя n (число чисел Фибоначчи) и вывести результат вэкран.Если пользователь вводит недопустимое значение для n (n <= 0), выведите сообщение об ошибке и попросите пользователя повторно ввести n (цикл проверки ввода для n).Это ДОЛЖЕН быть цикл, а не оператор if, как в Lab 2. </p>

Вывод должен быть похож на следующий:

Введите число чисел Фибоначчи для вычисления: 3 Первые 3 числа Фибоначчиявляются: 1 1 2

#include <iostream>
using namespace std;
int main()
{
    int f0 = 0, f1  = 1,f2= 2, i = 0, n;
    cout << "Enter the number of Fibonacci numbers to compute: ";
    cin >> n;
    if ( n <= 0)
    {
        cout <<"Error: Enter a positive number: ";
        return 1;
    }
    while ( i < n){
        f2 = f0 + f1;
        i++;
    }

    cout << "The first " << n << " Fibonacci numbers are: " << endl;
    cin >> n;
    return 0;
}

Ответы [ 5 ]

2 голосов
/ 28 сентября 2011
 while ( i < n){
        f2 = f0 + f1;
        i++;
    }

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

0 голосов
/ 28 сентября 2011

Как уже отмечали другие, так как вы никогда не изменяете f0 и f1 в цикл, f2 не будет зависеть от того, сколько раз петля. Так как вы все равно должны вывести все числа в конце, почему бы не попробовать сохранить их в массиве. Я бы инициализировал первые два значения вручную, затем зациклите, пока у меня не будет достаточно значений.

(Это можно сделать довольно хорошо, используя STL:

//  After having read n...
std::vector<int> results( 2, 1 );
while ( results.size() < n )
    results.push_back( *(results.end() - 1) + *(results.end() - 2));

Однако я не уверен, что это то, что ищет ваш инструктор. Я скорее подозреваю, что он хочет, чтобы ты занялся индексацией себя. Просто помните, что если вы инициализируете первые два значения вручную, ваш Индекс должен начинаться с 2, а не с 0.)

Еще одна вещь: спецификация, которую вы публикуете, говорит, что вы должны зацикливаться, если пользователь вводит недопустимое значение. Это на самом деле немного сложно: если пользователь вводит что-то, что не является int (скажем «abc»), затем 1) std::cin останется в состоянии ошибки (и все дальнейшие вводы будут неудачными) пока не очищено (по телефону std::cin.clear()), а незаконный символы не будут извлечены из потока, поэтому ваша следующая попытка не удастся, пока вы не удалите их. (Я бы предложил >> в std::string для этого; что удалит все до следующего белого пробел.) И не когда-либо обращайтесь к переменной, в которую вы >> вводили до Вы проверили поток на наличие сбоев - если ввод не выполнен. Если Ошибка ввода, переменная, которая вводится, не изменяется. Если, как здесь, вы не инициализировал его, тогда может произойти все что угодно.

Наконец (и я уверен, что это выходит за рамки вашего назначения), вы действительно делаете нужно что-то сделать, чтобы проверить переполнение. За определенной точкой, ваш вывод станет более или менее случайным; лучше остановиться и вывод, который вы отказываетесь в этом случае.

0 голосов
/ 28 сентября 2011

Если вам интересно, есть лучший способ рассчитать его .

0 голосов
/ 28 сентября 2011

Согласно википедии, ваше определение выключено.F0 = 0, F1 = 1, F2 = 1, F3 = 2, ...

http://en.wikipedia.org/wiki/Fibonacci_number

Предполагая, что Википедия верна, ваш цикл в основном

int i = 0, f, fprev;
while( i < n )
{
    if( i == 0 )
    {
        f = 0;
        fprev = 0;
    }
    else if( i == 1 )
    {
        f = 1;
    }
    else
    {
        int fnew = f + fprev;
        fprev = f;
        f = fnew;
    }
    i++;
}
0 голосов
/ 28 сентября 2011

Вы получили f2=f0+f1 право.Тем не менее, вы должны заметить, что когда вы увеличиваете i, f2 становится f1, а f1 становится f0.

Если вы назовете их так, это будет иметь больше смысла:

int f_i_minus_2 = 0, f_i_minus_1 = 1, f_i;

и у вас будет

f_i = f_i_minus_1+f_i_minus_2;

Теперь представьте, что i равно 3. Вы написали:

f[3] = f[2]+f[1]

Когда вы увеличиваете i,Вы должны иметь:

f[4] = f[3]+f[2]

То есть f_i ставится вместо f_i_minus_1, а f_i_minus_1 ставится вместо f_i_minus_2.

(Посмотрите наэто:

f[3] = f[2] + f[1]
 |       |
  \_____  \____
        \      \
f[4] = f[3] + f[2]

)

Итак, вам нужно два задания после вычисления f_i:

f_i_minus_2 = f_i_minus_1;
f_i_minus_1 = f_i;

Обратите внимание, что я сначала изменил f_i_minus_2 на f_i_minus_1потому что второе назначение уничтожает значение f_i_minus_1.

...