Menu
CoddyTech

Vòng lặp lồng nhau

Thuộc phần Kiến thức nền tảng trong hành trình R của Coddy. Bài học 44 trên 78.

Bạn có thể đặt một vòng lặp bên trong một vòng lặp khác để tạo thành vòng lặp lồng nhau. Vòng lặp bên trong chạy hết các lần lặp cho mỗi lần lặp của vòng lặp bên ngoài, rất hữu ích khi làm việc với các tổ hợp hoặc mẫu dạng lưới.

rows <- 3
cols <- 2
for (i in 1:rows) {
  for (j in 1:cols) {
    cat("i =", i, ", j =", j, "\n")
  }
}

Đầu ra:

i = 1 , j = 1 
i = 1 , j = 2 
i = 2 , j = 1 
i = 2 , j = 2 
i = 3 , j = 1 
i = 3 , j = 2

Với mỗi giá trị của i, vòng lặp bên trong lần lượt chạy qua tất cả giá trị của j. Khi i là 1, j chạy từ 1 đến 2. Sau đó, i trở thành 2 và j lại bắt đầu từ 1 đến 2. rows và cols không bao giờ thay đổi: chúng chỉ cho các vòng lặp biết khi nào cần dừng.

Một ví dụ thực tế là tạo một bảng nhân đơn giản:

for (row in 1:3) {
  for (col in 1:3) {
    cat(row * col, " ")
  }
  cat("\n")
}

Đầu ra:

1  2  3  
2  4  6  
3  6  9

Vòng lặp ngoài điều khiển các hàng, còn vòng lặp trong xử lý từng cột trong hàng đó. Sau khi hoàn thành mỗi hàng, ta in ra ký tự xuống dòng để chuyển sang dòng tiếp theo.

challenge icon

Thử thách

Dễ

Đọc hai số từ đầu vào: rows và cols.

Dùng các vòng lặp lồng nhau để in một hình chữ nhật gồm các số, trong đó mỗi ô chứa tổng của số hàng và số cột tương ứng. Các hàng được đánh số từ 1 đến rows, còn các cột được đánh số từ 1 đến cols.

In mỗi hàng trên một dòng riêng, các giá trị cách nhau bằng một dấu cách. Dùng cat() để in ra, thêm ký tự xuống dòng sau mỗi hàng.

Ví dụ, nếu đầu vào là 3 và 4, đầu ra sẽ là:

2 3 4 5 
3 4 5 6 
4 5 6 7

Ở hàng đầu tiên (hàng 1), các giá trị là 1+1=2, 1+2=3, 1+3=4, 1+4=5. Ở hàng thứ hai (hàng 2), các giá trị là 2+1=3, 2+2=4, 2+3=5, 2+4=6, và cứ tiếp tục như vậy.

cat() đặt một dấu cách giữa các giá trị bạn truyền vào, vì vậy cat(row + col, "") in số đó theo sau bởi chính xác một dấu cách.

Dùng một biến đếm mới cho mỗi vòng lặp (ví dụ: row cho các hàng và col cho các số trong một hàng), rồi so sánh biến đó với rows hoặc cols. Đừng thay đổi chính rows và cols: mỗi hàng đều cần dùng lại cols.

Tự làm thử

# Đọc đầu vào
con <- file("stdin", "r")
rows <- as.integer(suppressWarnings(readLines(con, n = 1)))
cols <- as.integer(suppressWarnings(readLines(con, n = 1)))
close(con)

# TODO: Viết code bên dưới
# Dùng các vòng lặp lồng nhau để in ra hình chữ nhật, mỗi ô chứa tổng của hàng và cột
# Dùng cat() để in các giá trị cách nhau bằng dấu cách và xuống dòng sau mỗi hàng
quiz iconTự kiểm tra

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 Kiến thức nền tảng

Tự luyện tập: Trình biên dịch R online