Menu
CoddyTech

Reduce

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 35 trên 64.

Reduce(f, x) gộp các phần tử của x thành một giá trị: hàm này gọi f với hai phần tử đầu tiên, sau đó với kết quả đó và phần tử thứ ba, rồi tiếp tục như vậy. Với +, nó cộng tất cả lại:

print(Reduce(function(acc, x) acc + x, c(3, 5, 10)))
print(Reduce(`+`, 1:5))

Đầu ra:

[1] 18
[1] 15

Các toán tử như + cũng là hàm. Khi viết trong dấu backtick, bạn có thể truyền `+` như bất kỳ hàm nào khác. Reduce() hữu ích nhất khi không có hàm dựng sẵn để kết hợp, chẳng hạn như giữ lại từ dài hơn trong hai từ:

longer <- function(a, b) if (nchar(b) > nchar(a)) b else a
print(Reduce(longer, c("fig", "banana", "kiwi", "cherry")))

Đầu ra:

[1] "banana"

Đối số thứ ba, init, là giá trị bắt đầu. Nó được dùng làm acc đầu tiên, đồng thời cũng là kết quả khi x rỗng:

print(Reduce(`+`, c(), 0))
print(Reduce(function(acc, w) paste0(acc, toupper(substr(w, 1, 1))), c("portable", "network", "graphics"), ""))

Đầu ra:

[1] 0
[1] "PNG"

accumulate = TRUE trả về mọi kết quả trung gian thay vì chỉ kết quả cuối cùng, nhờ đó bạn có được tổng lũy kế:

deposits <- c(100, -30, 50, -80)
print(Reduce(`+`, deposits, accumulate = TRUE))

Đầu ra:

[1] 100  70 120  40
challenge icon

Thử thách

Dễ

Hoàn thiện running_balance(start, changes). Bắt đầu từ start, áp dụng từng thay đổi theo thứ tự. Trả về một dòng cho mỗi thay đổi, ghi số dư sau thay đổi đó, after 1: 70, và dòng cuối cùng là lowest: theo sau là số dư thấp nhất đạt được, tính cả start.

Code được cung cấp đọc số dư ban đầu và các thay đổi từ một dòng, trong đó các thay đổi được phân tách bằng dấu phẩy, rồi in ra từng dòng được trả về.

Tự làm thử

running_balance <- function(start, changes) {
  # Viết code của bạn ở đây
  character(0)
}

# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(running_balance(as.numeric(input[1]), as.numeric(strsplit(input[2], ",")[[1]])), sep = "\n")
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 Logic và luồng điều khiển

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