Hàm đệ quy
Thuộc phần Logic và luồng chương trình trong hành trình PHP của Coddy. Bài học 8 trên 68.
Đệ quy là một kỹ thuật lập trình, trong đó một hàm (function) tự gọi chính nó để giải quyết vấn đề. Cách này tạo ra hành vi giống vòng lặp, nhưng thay vì dùng vòng lặp thông thường, hàm liên tục tự gọi lại với các tham số đã thay đổi cho đến khi tìm ra lời giải.
Mọi hàm đệ quy đều cần có hai thành phần thiết yếu để hoạt động chính xác:
Trường hợp cơ sở: Đây là điều kiện dừng đệ quy (recursion). Nếu không có điều kiện này, hàm (function) sẽ gọi lại chính nó vô hạn, khiến chương trình gặp sự cố. Trường hợp cơ sở xác định khi nào hàm nên trả về kết quả thay vì tiếp tục gọi lại chính nó.
Bước đệ quy: Đây là bước hàm gọi chính nó với phiên bản đã chỉnh sửa của bài toán ban đầu, dần tiến đến trường hợp cơ sở.
Đây là một ví dụ đơn giản về hàm đệ quy tính giai thừa:
<?php
function factorial($n) {
// Trường hợp cơ sở: factorial của 1 là 1
if ($n <= 1) {
return 1;
}
// Bước đệ quy: n! = n * (n-1)!
return $n * factorial($n - 1);
}
echo factorial(5); // Đầu ra: 120
?>Trong ví dụ này, factorial(5) gọi factorial(4), hàm này gọi factorial(3), và cứ tiếp tục như vậy cho đến khi đạt đến factorial(1) (trường hợp cơ sở). Sau đó, các kết quả được nhân ngược lên: 1 × 2 × 3 × 4 × 5 = 120.
Thử thách
DễTạo một hàm đệ quy (recursive function) có tên sumDigits, nhận một số nguyên dương và trả về tổng các chữ số của số đó. Hàm dùng đệ quy để tách số thành từng chữ số.
Bạn sẽ nhận một đầu vào: một số nguyên dương. Đọc đầu vào, gọi hàm đệ quy với số đó và in ra tổng các chữ số.
Định dạng đầu vào: Một dòng chứa một số nguyên dương
Đầu ra mong đợi: Tổng tất cả chữ số trong số đó
Tự làm thử
<?php
// Đọc đầu vào
$number = intval(fgets(STDIN));
// TODO: Tạo hàm (function) đệ quy sumDigits tại đây
// Gọi hàm và in ra kết quả
echo sumDigits($number);
?>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
1Hàm nâng cao
Hàm ẩn danhClosure và 'use'Hàm mũi tênHàm callbackDùng 'call_user_func'Hàm biếnTruyền tham chiếuHàm đệ quyÔn tập: tổng hợp về hàm4Mảng đa chiều
Tạo mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuChỉnh sửa phần tử trong mảng 2 chiềuLặp qua các vòng lặp lồng nhauMảng kết hợp 2 chiềuÔn tập: bài tập lưới đơn giản2Thao tác nâng cao với mảng
Thêm phần tử bằng 'array_push'Xóa phần tử bằng 'array_pop'Thêm phần tử vào đầu mảng bằng 'array_unshift'Xóa phần tử đầu mảng bằng 'array_shift'Gộp các mảng được đánh chỉ sốGộp các mảng kết hợpTrích xuất phần tử bằng 'array_slice'Kiểm tra giá trị bằng 'in_array'Tìm khóa bằng 'array_search'Ôn tập: bài tập về danh sách phát3Sắp xếp mảng
Sắp xếp mảng có chỉ số tăng dầnSắp xếp mảng có chỉ số giảm dầnSắp xếp mảng kết hợp theo giá trịSắp xếp mảng kết hợp theo khóaSắp xếp theo thứ tự tự nhiênSắp xếp tùy chỉnh bằng 'usort'Ôn tập: Sắp xếp bảng xếp hạngTự luyện tập: Trình biên dịch PHP online