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 đệ quyNó 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
0là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.
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
0Tự 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
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
1Chuyên sâu về chuỗi
Các phương thức của chuỗiTìm kiếm trong chuỗiThay thế và xóa khoảng trắngTách và nốiÔn tập: Kiểm tra tên người dùng7Kiểu liệt kê
Kiểu liệt kê là gì?Định nghĩa kiểu liệt kêCác giá trị của kiểu liệt kêKiểu liệt kê trong matchÔn tập: đèn giao thông10Hàm nâng cao
Trả về nhiều giá trịHàm lambda phần 1Hàm lambda phần 2Ôn tập: sắp xếp bằng lambdaHàm đệ quy phần 1Hàm đệ quy phần 2Ôn tập: tính tổng mảng lồng nhau13Hệ thống quản lý hàng tồn kho
Tổng quan dự ánThêm mặt hàng2Ra quyết định nâng cao
So khớp với biếnĐiều kiện bảo vệ trong so khớpMẫu mảngMẫu từ điểnKiểm tra thành viênÔn tập: Bộ phân tích lệnh5Ứng dụng sổ liên lạc
Hiển thị menuThêm liên hệ8Trình quản lý hồ sơ học sinh
Tổng quan dự ánThêm học sinh3Mảng nhiều chiều
Cơ bản về mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuVòng lặp lồng nhau với mảng 2 chiềuÔn tập: mảng 2 chiềuMảng răng cưaCác mẫu phổ biến với mảng 2 chiềuÔn tập: bàn cờ6Tập hợp với từ điển
Tập hợp là gì?Từ điển như một tập hợpThêm và xóaHợp và giaoHiệu tập hợpÔn tập: Xóa phần tử trùng lặp9Tổng hợp dữ liệu nâng cao
Tính tổng các giá trịTìm giá trị nhỏ nhất và lớn nhấtSắp xếp tùy chỉnhÔn tập: Sắp xếp từ điểnTự luyện tập: Trình biên dịch GDScript online