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

Когда я запускаю его и ввожу число, он просто повторяет его без остановок. например, если я поставлю 3, он будет делать это 3 3 3 3 3 НО НЕПРЕРЫВНО

int main()
{
int current=0, prev=1, prev2=1, fibnum;
cout << "Enter the number of Fibonacci numbers to compute: ";
cin >> fibnum;
if (fibnum <=0)
{
    cout << "Error: Enter a positive number: ";
}
while (fibnum > 0){
    current = prev + prev2;
    prev = prev2;
    prev2 = current;
    current++;

    cout << "," << fibnum;
    cout << endl;
}
return 0;
}

person Luis    schedule 29.09.2011    source источник
comment
У меня теперь это как While 9=(fibnum != 0) { Похоже, это помогло, но теперь я получаю кучу разных чисел   -  person Luis    schedule 29.09.2011
comment
Возьмите лист бумаги, запишите имена переменных и выполните код в уме, записывая, как меняются значения переменных на каждом шаге. (Или выполнить код с помощью отладчика.)   -  person UncleBens    schedule 29.09.2011
comment
Ваша самая большая проблема заключается в том, что вы используете fibnum в качестве счетчика и записываете его как текущее число в последовательности Фибоначчи. Также ваш цикл никогда не остановится, поскольку значение fibnum никогда не меняется. Вы также должны пройтись по тому, как работает Фибоначчи, это сумма двух чисел, которые стали перед собой.   -  person Gisli    schedule 29.09.2011


Ответы (6)


Есть несколько проблем с кодом:

  1. Вы никогда ничего не присваиваете fibnum внутри тела цикла, поэтому его значение никогда не меняется.
  2. Цель current++ совершенно неясна.

По сути, вам нужно определиться с точным значением каждой переменной и придерживаться его повсюду. То, как используются эти переменные, явно вызывает путаницу в отношении назначения current и fibnum.

person NPE    schedule 29.09.2011
comment
fibNum назначается из стандартного ввода - person Jesus Ramos; 29.09.2011
comment
@JesusRamos: Да, он читается со стандартного ввода перед циклом. После запуска цикла он никогда не меняется, поэтому цикл никогда не завершается. - person Ben Voigt; 29.09.2011

изменить на

int current_fib_num = 0;
....
while (current_fib_num++ != fibNum)
{
    ....
    // your code here
}
person Jesus Ramos    schedule 29.09.2011
comment
Хорошо, я сделал это, но теперь он просто выдает мне кучу разных чисел без остановок. - person Luis; 29.09.2011
comment
добавьте эти строки кода, current++ не имеет никакого смысла, как вы используете его в своем коде. - person Jesus Ramos; 29.09.2011

В дополнение к предыдущим ответам обратите внимание, что вы можете использовать преимущества рекурсии, если вам нужно вычислить число выдумки с определенным числом. Что-то такое:

#include <cstddef>

std::size_t fib( std::size_t num )
{
    // For first two numbers
    if (num <= 2)
        return 1;

    return fib(num - 1) + fib(num - 2);
}

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

person Roman Kruglov    schedule 29.09.2011

Вы пытаетесь напечатать fibnum, но он не меняется внутри цикла while. Вместо этого вы должны печатать текущий. Также вам нужно установить счетчик, который будет видеть конец цикла while.

person Kraken    schedule 29.09.2011

#include <iostream>

using std::cin;
using std::cout;

int main()
{
  int a=1, b=1, nums_to_print;
  while (1) {
    cout << "Enter the number of Fibonacci numbers to compute: ";
    cin >> nums_to_print;
    if (nums_to_print > 0) {
      while (1) {
        cout << a;
        b += a;
        a = b - a;
        if (--nums_to_print) cout << ",";
        else break;
      }
      cout << "\n";
      return 0;
    }

    cout << "Error: Enter a positive number.\n";
  }
}

Демонстрация: http://ideone.com/3H8Fq

person Ben Voigt    schedule 29.09.2011

Есть несколько вещей, которые вам нужно исправить.

Вам нужна переменная count;

int current=0, prev=0, prev2=1, fibnum;

int count;

....

Чтобы вывести первое число перед циклом

cout<<prev2;

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

for(count = 0; count <= fibnum; count++){
    current = prev + prev2;
    prev = prev2;
    prev2 = current;

Вам нужно напечатать текущий, а не fibnum -> fibnum - это общее число, которое вам нужно напечатать

    cout << "," << current;
}
person Jan S    schedule 29.09.2011
comment
Нет, вам не нужны дополнительные переменные. Их уже больше, чем нужно, смотрите мой ответ. И увеличение count дважды за цикл не даст желаемого результата. - person Ben Voigt; 29.09.2011
comment
@BenVoigt Счетчик ++ в цикле был недосмотром - он просто преобразовывал время в for. И да, еще одна переменная не нужна, но я чувствую, что это делает ее более понятной. - person Jan S; 30.09.2011