repeat và break
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 49 trên 64.
repeat chạy phần thân lặp đi lặp lại cho đến khi một break bên trong dừng vòng lặp. Cấu trúc này phù hợp với vòng lặp mà điều kiện thoát chỉ được biết ở giữa phần thân:
n <- 1
repeat {
n <- n * 2
if (n > 50) break
}
print(n)Đầu ra:
[1] 64Dãy Collatz là một ví dụ: chia đôi các số chẵn, biến các số lẻ thành 3n + 1 và dừng ở 1. Ta không biết trước số bước cần thực hiện:
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)Đầu ra:
[1] 8next bỏ qua phần còn lại của lần lặp hiện tại và bắt đầu lần lặp tiếp theo. Lệnh này hoạt động trong các vòng lặp repeat, while và for:
for (x in 1:8) {
if (x %% 3 == 0) next
cat(x, "")
}
cat("\n")Đầu ra:
1 2 4 5 7 8 Vòng lặp repeat không có break nào có thể tiếp cận sẽ không bao giờ kết thúc. Hãy dùng một bộ đếm làm giới hạn an toàn khi điều kiện thoát phụ thuộc vào dữ liệu:
total <- 0
tries <- 0
repeat {
tries <- tries + 1
total <- total + tries
if (total >= 20 || tries == 100) break
}
print(c(tries, total))Đầu ra:
[1] 6 21Thử thách
DễHoàn thành digital_root(n). Thay n bằng tổng các chữ số của nó cho đến khi chỉ còn một chữ số, rồi trả về <result> after <steps> steps: 9875 cho kết quả 2 after 3 steps (9875, 29, 11, 2). Số vốn đã có một chữ số thì cần 0 bước.
sum(as.numeric(strsplit(as.character(n), "")[[1]])) tính tổng các chữ số của n.
Đoạn code được cung cấp đọc n và in ra giá trị trả về.
Tự làm thử
digital_root <- function(n) {
# Viết code của bạn ở đây
""
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(digital_root(as.numeric(input[1])), sep = "\n")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online