Menu
Coddy logo textTech

repeat i break

Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 49 z 64.

repeat uruchamia swoje ciało raz za razem, aż instrukcja break znajdująca się wewnątrz go zatrzyma. Nadaje się do pętli, której warunek zakończenia jest znany dopiero w trakcie wykonywania ciała:

n <- 1
repeat {
  n <- n * 2
  if (n > 50) break
}
print(n)

Wynik:

[1] 64

Przykładem jest ciąg Collatza: dziel liczby parzyste przez dwa, zamieniaj nieparzyste na 3n + 1 i zatrzymaj się na 1. Liczba kroków nie jest znana z góry:

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)

Wynik:

[1] 8

next pomija resztę bieżącej iteracji i rozpoczyna następną. Działa w pętlach repeat, while i for:

for (x in 1:8) {
  if (x %% 3 == 0) next
  cat(x, "")
}
cat("\n")

Wynik:

1 2 4 5 7 8 

Pętla repeat bez osiągalnego break nigdy się nie kończy. Użyj licznika jako limitu bezpieczeństwa, gdy wyjście zależy od danych:

total <- 0
tries <- 0
repeat {
  tries <- tries + 1
  total <- total + tries
  if (total >= 20 || tries == 100) break
}
print(c(tries, total))

Wynik:

[1]  6 21
challenge icon

Wyzwanie

Łatwy

Uzupełnij digital_root(n). Zastępuj n sumą jego cyfr, aż pozostanie jedna cyfra, i zwróć <result> after <steps> steps: 9875 daje 2 after 3 steps (9875, 29, 11, 2). Liczba, która już ma jedną cyfrę, wymaga 0 kroków.

sum(as.numeric(strsplit(as.character(n), "")[[1]])) sumuje cyfry liczby n.

Dostarczony kod odczytuje n i wypisuje zwróconą wartość.

Spróbuj swoich sił

digital_root <- function(n) {
  # Wpisz tutaj swój kod
  ""
}

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
cat(digital_root(as.numeric(input[1])), sep = "\n")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator R online