Рекурсия, итерация и оценки сложности алгоритмов
Java и циклические конструкции
Математическая модель итерации, описанная в первой секции данного параграфа не дает никаких практических рекомендаций, как именно реализовать вычисления. Во второй главе книги будут рассмотрены три более частных схемы обработки информации с помощью метода итерации — проектирование цикла при помощи инварианта и схемы вычислений инвариантной и индуктивной функций. Пока же ограничимся описанием управляющих конструкций языка Java, которые используют для организации циклов, и рассмотрением нескольких примеров программ.
Язык Java предусматривает три различных оператора цикла: while, do-while и for. Первый из них обычно используют в ситуации, когда тело цикла нужно выполнить нуль или более раз, а второй применяется, если его выполнение хотя бы раз обязательно. Третий из операторов является наиболее универсальным и используется в различных ситуациях.
Дополнительными средствами, используемыми при организации циклов, являются операторы break и continue. Первый из них прерывает выполнение цикла, а второй позволяет досрочно перейти к выполнению следующей итерации, проигнорировав часть операторов тела цикла, еще не выполненных в текущей итерации. Заметим, что в языке Java отсутствует оператор goto, — в тех редких ситуациях, где он мог бы оказаться полезным, можно использовать операторы break или continue с метками.
В качестве первого примера рассмотрим опять задачу вычисления факториала и программу, реализующую предложенную выше схему применения преобразования .
Задача 5.3. Напишите итерационную программу, вычисляющую факториал введенного натурального числа.
Текст программы
public class FactIv1 { public static void main(String[] args) throws Exception { int n, i, k; n = Xterm.inputInt("Введите n -> "); i = k = 1; while (i <= n) { k *= i; i += 1; } Xterm.println("" + n + "! = " + k); } }
Конструкцию while в ней можно заменить на do-while:
Фрагмент программы (FactIv2.java)
do { k *= i; i += 1; } while (i <= n);
А еще лучше воспользоваться циклом for:
Фрагмент программы (FactIv3.java)
int i, k, n = Xterm.inputInt("Введите n -> "); for (i = k = 1; i <= n; i++) k *= i; Xterm.println("" + n + "! = " + k);