repeatとbreak
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 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 到達可能な break を持たない repeat ループは決して終了しません。終了条件がデータに依存する場合は、安全制限としてカウンターを保持します:
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)を完成させてください。1桁になるまでnを各桁の数字の合計で置き換え、<result> after <steps> stepsを返します。9875の場合は2 after 3 stepsになります(9875、29、11、2)。すでに1桁の数は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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ