Menu
CoddyTech

reduce / inject

Thuộc phần Logic và luồng xử lý trong hành trình Ruby của Coddy. Bài học 23 trên 56.

Đôi khi bạn cần rút gọn cả một mảng thành một giá trị duy nhất, chẳng hạn như tổng, tích hoặc chuỗi dài nhất. reduce (còn gọi là inject: cùng một phương thức, hai tên gọi) là công cụ để làm việc đó.

Khối lệnh nhận hai tham số: bộ tích lũy (accumulator) và phần tử hiện tại. Giá trị trả về của khối lệnh trở thành bộ tích lũy tiếp theo.

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total   # 10

Lần lượt, giá trị của biến tích lũy là 0 → 1 → 3 → 6 → 10.

Đối số đầu tiên là giá trị bắt đầu của biến tích lũy. Nếu bạn bỏ qua đối số này, Ruby sẽ dùng phần tử đầu tiên của mảng:

[1, 2, 3, 4].reduce { |acc, n| acc * n }   # 24

Với các phép toán thuần túy như cộng và nhân, Ruby có cách viết tắt: truyền một symbol thay vì một block:

[1, 2, 3, 4].reduce(:+)   # 10
[1, 2, 3, 4].reduce(:*)   # 24

Khi đã biết cách tạo một bộ tích lũy tùy chỉnh, bạn có thể tính gần như mọi thứ chỉ trong một lượt duyệt.

challenge icon

Thử thách

Dễ

Đọc một danh sách số nguyên được phân tách bằng dấu phẩy. In ra ba dòng:

  1. Tổng (dùng reduce(:+))
  2. Tích (dùng reduce(:*))
  3. Giá trị lớn nhất, được tính bằng reduce với một khối lệnh tường minh, không dùng max.

Với đầu vào 2,5,3,8, đầu ra là:

18
240
8

Tự làm thử

numbers = gets.chomp.split(",").map(&:to_i)

# TODO: in ra tổng, tích và giá trị lớn nhất (dùng reduce + khối lệnh tường minh)
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 xử lý

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