Menu
CoddyTech

Hàm đệ quy phần 1

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 57 trên 78.

Hàm đệ quy là hàm tự gọi chính nó. Mỗi lần gọi giải quyết một phiên bản nhỏ hơn của bài toán, cho đến khi bài toán đủ đơn giản để trả lời trực tiếp.

Hàm này cộng các số nguyên từ 1 đến n:

func sum_to_n(n: int) -> int:
	if n == 0: # trường hợp cơ sở
		return 0
	return n + sum_to_n(n - 1) # bước đệ quy

Nó gồm hai phần:

  • Trường hợp cơ sở đưa ra câu trả lời mà không gọi lại hàm: tổng đến 0 là 0.
  • Bước đệ quy gọi hàm với giá trị nhỏ hơn, n - 1, rồi tạo câu trả lời từ kết quả đó.

sum_to_n(3) bằng 3 + sum_to_n(2), tức là 3 + 2 + sum_to_n(1), tức là 3 + 2 + 1 + sum_to_n(0). Trường hợp cơ sở trả về 0, các lời gọi đang chờ lần lượt hoàn tất: kết quả là 6.

Mỗi bước đệ quy phải tiến gần hơn đến trường hợp cơ sở. Nếu không có trường hợp cơ sở hoặc có một bước như n + 1 không bao giờ đạt tới trường hợp đó, hàm sẽ tiếp tục tự gọi chính nó. Godot cho phép khoảng 1.000 lần gọi lồng nhau, sau đó dừng chương trình và báo lỗi.

challenge icon

Thử thách

Dễ

Chương trình đọc một số nguyên n (0 trở lên) và gọi count_down(n).

Bên dưới _ready(), hãy viết hàm đệ quy count_down với một tham số. Hàm in ra từng số từ đối số của nó xuống đến 0, mỗi số trên một dòng. Không dùng vòng lặp: hàm in ra số của mình rồi gọi lại chính nó với số nhỏ hơn tiếp theo.

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

3
2
1
0

Tự làm thử

extends Node

func _ready():
	var n := int(OS.read_string_from_stdin())
	count_down(n)

# Viết hàm đệ quy count_down(n) bên dưới
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