Menu
CoddyTech

Phương thức reduce

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 62 trên 78.

reduce() gộp tất cả phần tử của một mảng thành một giá trị: một tổng, một tích, phần tử lớn nhất hoặc một câu.

var numbers = [1, 2, 3, 4]
var total = numbers.reduce(func(acc, n): return acc + n, 0)
print(total)
10

Hàm này nhận hai đối số: một hàm và một giá trị bắt đầu, ở đây là 0. Hàm nhận kết quả tính được đến thời điểm hiện tại, gọi là bộ tích lũy (acc), cùng với phần tử tiếp theo. Giá trị hàm trả về sẽ trở thành bộ tích lũy mới:

  • acc bắt đầu bằng 0
  • 0 + 1 là 1, 1 + 2 là 3, 3 + 3 là 6, 6 + 4 là 10
  • sau phần tử cuối cùng, reduce() trả về bộ tích lũy: 10

Với phép nhân, bắt đầu từ 1: numbers.reduce(func(acc, n): return acc * n, 1) bằng 24.

Nếu không có giá trị khởi đầu, phần tử đầu tiên sẽ là giá trị khởi đầu và hàm chạy từ phần tử thứ hai trở đi. Cách này phù hợp để tìm phần tử lớn nhất:

var biggest = [4, 9, 2].reduce(func(a, b): return a if a > b else b)
print(biggest) # 9

Với một mảng rỗng không có giá trị bắt đầu, reduce() trả về null, vì vậy hãy cung cấp giá trị bắt đầu nếu mảng có thể rỗng.

Bộ tích lũy có thể thuộc bất kỳ kiểu dữ liệu nào. Với giá trị khởi đầu là "", cách này tạo một chuỗi từ các chữ cái đầu tiên:

var words = ["game", "over"]
print(words.reduce(func(acc, w): return acc + w[0], "")) # go
challenge icon

Thử thách

Dễ

Chương trình đọc một dòng gồm các số nguyên được phân tách bằng dấu phẩy và lưu chúng vào mảng numbers. Phần này đã được viết sẵn.

Dùng reduce() cho từng mục đích sau để in ra ba dòng:

  1. tổng các số
  2. tích của chúng
  3. số lớn nhất (viết phép so sánh trong lambda, không gọi max())

Luôn có ít nhất một số. Với đầu vào 3,7,2,8,4, đầu ra là:

24
1344
8

Tự làm thử

extends Node

func _ready():
	var numbers := []
	for part in OS.read_string_from_stdin().split(","):
		numbers.append(int(part))
	# In ra tổng, tích và số lớn nhất, mỗi kết quả dùng reduce()
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 chương trình

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