Menu
Coddy logo textTech

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] 8

nextは現在の反復の残りをスキップし、次の反復を開始します。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
challenge icon

チャレンジ

簡単

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")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ