Другой способ написать циклы, которые делают что-то другое только на первой итерации? - PullRequest
1 голос
/ 21 февраля 2020

Введение: Привет, новичок и начинающий java ученик здесь и хотели бы помочь "очистить" мой код. Я успешно распечатал данный вывод, но мне было интересно, есть ли другие «более простые» способы подойти к этому упражнению. Я думал о рекурсии, но на самом деле не знаю, с чего начать.

Проблема

  • Напишите al oop, который генерирует этот вывод:

        1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377
    
  • Ваш вывод должен выглядеть точно так же, как в примере выше - в одну строку с запятыми и пробелами, как показано. Обратите внимание, что в конце строки нет запятой.

Что я пробовал

Мое решение заключается в использовании трех переменных типа int: first_num, sec_num, third_num с для l oop и , если оператор.

// declare and initialize int first, sec, and sum
int first_num = 1;
int sec_num = 1;
int sum = 0;

//2
for (int i = 0; i <= 10;i++) {
    sum = first_num + sec_num;
    if (i == 0) {
        System.out.print(first_num + ", " + sec_num + ", ");
    }
    System.out.print(sum + ", ");
    first_num = sec_num;
    sec_num = sum;
}
System.out.print(sum);

Ответы [ 5 ]

1 голос
/ 22 февраля 2020
for(int i = 0; i<=0;i++) {
    System.out.println("1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377");
}
0 голосов
/ 22 февраля 2020

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

Вам не нужно начинать l oop с 0. На самом деле вы можете начать для l oop с третьего числа, потому что вы уже знаете, что первые два числа равны 1.

Вот код:

int first_num = 1, int sec_num = 1;
int index = 2; // since you want to start generating numbers from index 3
int endIndex = 15; // total numbers in your list
int nextNum = 0;
while(index++ < endIndex){
    nextNum = first_num + sec_num;
    System.out.println(nextNum + ", ");
    first_num = sec_num;
    sec_num = nextNum;
}
System.out.println(nextNum);

0 голосов
/ 21 февраля 2020

попробуйте вот так

int a, b, c, i, n;
n = 10;
a = b = 1;

System.out.print(a + ", " + b);

for (i = 1; i <= n - 2; i++) {
    c = a + b;
    System.out.print(", ");
    System.out.print(c);
    a = b;
    b = c;
}

код от ЗДЕСЬ

с while l oop:

int a, b, c, i, n, count;
n = 10;
a = b = count = 1;

System.out.print(a + ", " + b);

while(count <= n -2) {
    c = a + b;
    System.out.print(", ");
    System.out.print(c);
    a = b;
    b = c;

    count++;
}
0 голосов
/ 22 февраля 2020

Вы также можете сделать это следующим образом:

public class Main {
    public static void main(String[] args) {
        int i;
        for (i = 1; i <= 13; i++) {
            System.out.print(fibonacci(i) + ", ");
        }
        System.out.print(fibonacci(i));
    }

    static int fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return fibonacci(n - 2) + fibonacci(n - 1);
    }
}

Выход:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377

В качестве альтернативы,

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        fibonacci(1, 1, 377, sb);
        System.out.println(sb.substring(0, sb.lastIndexOf(",")));
    }

    static void fibonacci(int n1, int n2, int limit, StringBuilder sb) {
        if (n1 > limit) {
            return;
        }
        sb.append(n1).append(", ");
        fibonacci(n2, n1 + n2, limit, sb);
    }
}

Выход:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377
0 голосов
/ 21 февраля 2020

Существует более простая версия вашего кода, но она не является описательной на первый взгляд

int first = 0;
int second = 1;

System.out.print(second);  
for (int i = 0; i <= 12; i++) {
    second = second + first;    // Now second equals to the sum of the first and old value of the second
    first = second - first;     // If subtract from second the value of first, we can get old value of the second

    System.out.print(", " + second);    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...