repeat и break
Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 49 из 64.
repeat снова и снова выполняет своё тело, пока находящийся внутри него break не остановит цикл. Он подходит для цикла, условие выхода из которого становится известно только в середине тела:
n <- 1
repeat {
n <- n * 2
if (n > 50) break
}
print(n)Вывод:
[1] 64Последовательность Коллатца — это пример: делите чётные числа пополам, превращайте нечётные в 3n + 1 и останавливайтесь на 1. Количество шагов заранее неизвестно:
n <- 6
steps <- 0
repeat {
if (n == 1) break
n <- if (n %% 2 == 0) n / 2 else 3 * n + 1
steps <- steps + 1
}
print(steps)Вывод:
[1] 8next пропускает остаток текущей итерации и начинает следующую. Он работает в циклах repeat, while и for:
for (x in 1:8) {
if (x %% 3 == 0) next
cat(x, "")
}
cat("\n")Вывод:
1 2 4 5 7 8 Цикл repeat без достижимого break никогда не заканчивается. Используй счётчик как ограничение безопасности, когда выход зависит от данных:
total <- 0
tries <- 0
repeat {
tries <- tries + 1
total <- total + tries
if (total >= 20 || tries == 100) break
}
print(c(tries, total))Вывод:
[1] 6 21Задание
ЛегкоРеализуйте digital_root(n). Заменяйте n суммой его цифр, пока не останется одна цифра, и возвращайте <result> after <steps> steps: для 9875 получается 2 after 3 steps (9875, 29, 11, 2). Для числа, в котором уже есть одна цифра, требуется 0 шагов.
sum(as.numeric(strsplit(as.character(n), "")[[1]])) складывает цифры числа n.
Предоставленный код считывает n и выводит возвращённое значение.
Попробуйте сами
digital_root <- function(n) {
# Напишите ваш код здесь
""
}
# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
cat(digital_root(as.numeric(input[1])), sep = "\n")
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
1Строки углублённо
Подстроки с substr()Форматирование с sprintf()Разделение и объединениеПоиск в строкахЗамена текстаПовторение — создание имени пользователя4Матрицы
Создание матрицИндексация матрицСводные данные по строкам и столбцамАрифметика матрицПовторение — схема рассадки7Семейство Apply
lapply и sapplyMap и mapplyFilter и FindReduceПовторение — конвейер обработки данных10Продвинутые конструкции управления
Функция switch()Векторизованный ifelse()repeat и breakРекурсивные функцииПовторение — классификатор оценок2Поиск по ключам и значениям
Поиск в именованных векторахПроверка ключейДобавление и удаление ключейПеребор имёнПовторение — биржа акций5Проект — Журнал оценок
Добавление учениковВыставление оценок3Множества и подсчёт
Уникальные значенияОперации с множествамиПроверка принадлежностиПодсчёт с помощью table()Повторение — гости мероприятия6Функции как значения
Анонимные функцииПередача функцийВозврат функцийЗамыкания с состояниемПовторение — правила скидок9Таблицы данных
Создание таблиц данныхСтолбцы и строкиФильтрация строкДобавление и сортировкаПовторение — отчёт о продажах12Проект — Трекер расходов
Запись расходовОбщие расходыПотренируйтесь самостоятельно: Онлайн-компилятор R