Рекурсия и циклы

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ProgrammingTechniquesGroup(["Programming Techniques"]) java/BasicSyntaxGroup -.-> java/variables("Variables") java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/BasicSyntaxGroup -.-> java/for_loop("For Loop") java/BasicSyntaxGroup -.-> java/while_loop("While Loop") java/BasicSyntaxGroup -.-> java/break_continue("Break/Continue") java/BasicSyntaxGroup -.-> java/output("Output") java/ProgrammingTechniquesGroup -.-> java/recursion("Recursion") subgraph Lab Skills java/variables -.-> lab-178552{{"Рекурсия и циклы"}} java/if_else -.-> lab-178552{{"Рекурсия и циклы"}} java/for_loop -.-> lab-178552{{"Рекурсия и циклы"}} java/while_loop -.-> lab-178552{{"Рекурсия и циклы"}} java/break_continue -.-> lab-178552{{"Рекурсия и циклы"}} java/output -.-> lab-178552{{"Рекурсия и циклы"}} java/recursion -.-> lab-178552{{"Рекурсия и циклы"}} end

Содержание

Рекурсия в информатике - это техника, при которой решение задачи зависит от решений более мелких экземпляров той же задачи (в отличие от итерации). Прием называется рекурсией и может быть применен к многим типам задач. Рекурсия - одна из центральных идей информатики. Сила рекурсии, очевидно, заключается в возможности определения бесконечного множества объектов с помощью конечного числа утверждений. Таким же образом, бесконечное количество вычислений может быть описано с помощью конечной рекурсивной программы, даже если эта программа не содержит явных повторений.

Пример:

Напишите следующий код в файле /home/labex/project/recursionTest.java:

public class recursionTest{
    public static int fibonacci(int n){
        if(n<=2){
            return 1;
        }else{
            return fibonacci(n-1)+fibonacci(n-2);
        }
    }
    public static void main(String[] args){
        int res = recursionTest.fibonacci(10);
        System.out.println(res);
    }
}

Вывод:

Запустите файл recursionTest.java с помощью следующих команд:

javac /home/labex/project/recursionTest.java
java recursionTest

Посмотрите на вывод:

55

Цикл while

При входе в цикл while сначала проверяется условие. Цикл while будет выполняться до тех пор, пока условие ложно. Синтаксис выглядит так:

Пример:

Напишите следующий код в файле /home/labex/project/whileTest.java:

public class whileTest
{
    public static void main(String[] args)
    {
        int x = 1;
        // выходить, когда x станет больше 3, внутренний код будет выполняться всего 3 раза.
        while (x <= 3)
        {
            System.out.println("x = " + x);
            // увеличивать значение x на 1 на каждой итерации для следующей итерации
            x++;
        }
    }
}

Вывод:

Запустите файл whileTest.java с помощью следующих команд:

javac /home/labex/project/whileTest.java
java whileTest

Посмотрите на вывод:

x = 1
x = 2
x = 3

Цикл do-while

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

Пример:

Напишите следующий код в файле /home/labex/project/doWhileTest.java:

public class doWhileTest
{
    public static void main(String[] args)
    {
        int x = 1;
        do
        {
            // код ниже будет выполнен сначала, затем проверяется условие.
            System.out.println("x = " + x);
            x++;
        }
        while (x <= 3);
    }
}

Вывод:

Запустите файл doWhileTest.java с помощью следующих команд:

javac /home/labex/project/doWhileTest.java
java doWhileTest

Посмотрите на вывод:

x = 1
x = 2
x = 3

Цикл for

Цикл for выглядит так:

Пример:

for (init expression; condition expression; increment expression)
{
    // statements here
}

Условие инициализации, которое отмечает начало цикла for, будет выполняться только один раз. Условное выражение будет проверяться каждый раз перед входом в цикл. Он используется для проверки условия выхода из цикла и должен возвращать логическое значение. Как только условие становится истинным, инструкции в цикле выполняются; после этого выражение инкремента будет выполняться для изменения значений счетчика или других переменных для следующей итерации.

Пример:

Напишите следующий код в файле /home/labex/project/forTest.java:

public class forTest
{
    public static void main(String[] args)
    {
        // цикл for начинается, когда x = 1 до x <= 3
        for (int x = 1; x <= 3; x++) {
            System.out.println("x = " + x);
        }
    }
}

Вывод:

Запустите файл forTest.java с помощью следующих команд:

javac /home/labex/project/forTest.java
java forTest

Посмотрите на вывод:

x = 1
x = 2
x = 3

Вы можете выйти из цикла в любое время в теле цикла, используя код, подобный continue или break в блоке if инструкций. break выйдет из всего цикла, в то время как continue только прервет текущую итерацию и выполнит следующую итерацию (если условие истинно).

Пример:

Напишите следующий код в файле /home/labex/project/loopTest.java:

public class loopTest
{
    public static void main(String[] args)
    {
        // цикл for начинается, когда x = 1 до x <= 3
        for (int x = 1; x <= 3; x++) {
            if(x==2){
                // выйти из всего цикла
                break;
                // continue только прервет текущую итерацию и выполнит следующую.
                // вы можете удалить выражение break и использовать continue. Посмотрите на вывод.
                // continue;
            }
            System.out.println("x = " + x);
        }
    }
}

Вывод:

Запустите файл loopTest.java с помощью следующих команд:

javac /home/labex/project/loopTest.java
java loopTest

Посмотрите на вывод:

x = 1

Резюме

В этом практическом занятии мы изучили три типа циклов. Цикл for и цикл while легки в изучении, в то время как цикл do-while не очень идеален с логической точки зрения. Его следует выбирать очень осторожно.