Menu
CoddyTech

repeat 和 break

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 49 课,共 64 课。

repeat 会一遍又一遍地运行循环体,直到其中的 break 停止循环。它适用于只有在循环体中途才能确定退出条件的循环:

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

输出:

[1] 64

科拉茨序列就是一个例子:偶数除以 2,奇数变成 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)。将 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")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器