2016-03-25 1 views
1

Я пытаюсь распечатать все положительные числа последовательности Фибоначчи, которые ниже четырех миллионов.Почему мой код заканчивается немедленно?

public static void main(String[] args) { 

    int n1 = 1; 
    int n2 = 2; 
    int n3 = 0; 

    while (n3 <= 4000000) { 
     n3 = n1 + n2; 
     if (n3 % 2 == 0) { 
      System.out.println(n3); 
     } 
     n1+=1; 
     n2+=1; 
    } 
} 
+3

Почему вы делаете это по модулю? Это только вывело бы четные числа в последовательности. – Makoto

+0

Получаете ли вы какие-либо ошибки при запуске кода?Кроме того, это не алгоритм, используемый для распечатки последовательности фибоначчи ... * n1 * и * n2 * не должны увеличиваться – costrom

+3

Это не последовательность Фибоначчи. –

ответ

0

Проблема заключается в том, что вы не вычисляете числа Фибоначчи. Однако, даже если вы это сделали, это должно выполняться так быстро, вы не увидите, что он вычисляет результат.

Вам нужны все четные значения Фибоначчи. Каждый третий Фибоначчи, даже если вам не нужно проверять каждый. Вы можете сделать

int a = 1; 
int b = 1; 
int c = a + b; 
long sum = 0; 
while (c < 4_000_000) { 
    sum += c; 
    a = b + c; 
    b = a + c; 
    c = a + b; // skip forward to the next even fibonacci 
} 

Примечания: это Опускает %, который является дорогостоящим и имеет 1/3rd петель.

6

Ваша логика неверна.

Если вы должны были пройти через этот код в отладчике вы бы увидели, что n3 является никогда даже (что вы тестируете для в n3 % 2 == 0), поэтому условие if никогда не верно.

Это не займет много времени, так как современный процессор рассчитан на 4 миллиона (максимум на несколько миллисекунд), поэтому программа немедленно прекращает работу.

3

Ваш код не заканчивается немедленно, он просто ничего не печатает. n1 начинается с 1 и n2 как 2, давая сумму 3, что является нечетным - и, следовательно, не печатается. Каждая итерация цикла увеличивает оба числа, дает еще один нечетный результат и снова ничего не печатает.

числа Фибоначчи, однако, не имеют ничего общего с четными номерами - они просто сумма двух предыдущих чисел в серии:

while (n3 <= 4000000) { 
    n3 = n1 + n2; 
    System.out.println(n3); 
    n1 = n2; 
    n2 = n3; 
} 
2

Во-первых, вы не установить n1 и n2 правильно на конец цикла. Не добавляйте 1 к каждому из n1 и n2. Поскольку вы делаете только увеличение каждого из n1 и n2, один из них является нечетным, и один из них даже в любое время. Это делает n3 нечетным, поэтому он никогда не печатается. Вместо этого установите n1 в n2, затем n2 - n3.

Во-вторых, все числа последовательности Фибоначчи являются положительными, поэтому нет причин поместить условие на печать. В любом случае это условие будет печатать только четные. Удалите if, оставив печать.

0

Почему мой код заканчивается немедленно? (Не вдаваясь в логике)

Потому что ваш код ничего не печатает как условие if (n3 % 2 == 0) всегда ложно (n3 всегда нечетное), удалить КРП состояние и оно не будет прекращено немедленно, потому что печать занимает некоторое время.

 Смежные вопросы

  • Нет связанных вопросов^_^