Tin Học KHMT
Ôn tập Tin học THPT › Tin học 11 - Khoa học máy tính › Bài 30
Tin học 11 - Khoa học máy tính

Bài 30. Đệ quy (recursion)

Bài học này giới thiệu đệ quy (recursion) - kỹ thuật để một hàm tự gọi lại chính nó nhằm giải một bài toán nhỏ hơn, cùng dạng với bài toán ban đầu - cùng với phần không thể thiếu của mọi hàm đệ quy: điều kiện dừng (base case).

Chủ đề F · Lập trình, Thuật toán & CTDL (KHMT) - đọc khoảng 12 phút · 24 câu luyện tập trong ứng dụng

Bắt đầu bằng một hình dung

Hãy hình dung một bộ búp bê gỗ truyền thống của Nga, thường gọi là búp bê matryoshka: một con búp bê khoác áo hoa sặc sỡ, cao chừng hai bàn tay. Mở con búp bê ấy ra, bên trong lại hiện ra một con búp bê giống hệt về hình dáng và hoa văn, chỉ nhỏ hơn một chút. Mở tiếp con này, lại thấy một con nhỏ hơn nữa nằm bên trong - cứ như vậy, hết lớp này đến lớp khác, cho đến khi gặp một con búp bê đặc ruột, nhỏ nhất, không thể mở ra được nữa. Con búp bê nhỏ nhất ấy chính là điểm dừng của cả bộ: không phải vì có ai ra lệnh dừng lại, mà vì tự bản thân nó không còn gì để mở tiếp.

Nhiều bài toán trong lập trình cũng được giải theo đúng tinh thần của bộ búp bê đó: muốn giải một bài toán cỡ lớn, ta ‘mở’ nó ra và thấy bên trong một bài toán CÙNG DẠNG như vậy, chỉ nhỏ hơn - rồi lặp lại đúng cách làm đó cho bài toán nhỏ hơn, cho đến khi gặp một trường hợp nhỏ nhất, đơn giản đến mức giải được ngay, không cần mở thêm nữa. Cách giải một bài toán bằng cách quy bài toán đó về chính nó, ở quy mô nhỏ hơn, gọi là đệ quy.

Nội dung bài học

  1. Đệ quy là gì?
  2. Điều kiện dừng (base case) - phần bắt buộc phải có
  3. Khi nào nên dùng đệ quy?

Tóm tắt lý thuyết cần nhớ

  • Đệ quy là khi một hàm tự gọi lại chính nó để giải một bài toán nhỏ hơn nhưng cùng dạng với bài toán ban đầu - bài toán cỡ n được giải dựa trên kết quả của bài toán cỡ n - 1.
  • Mọi hàm đệ quy đều bắt buộc phải có điều kiện dừng (base case) - trường hợp nhỏ nhất, giải được ngay không cần gọi tiếp; thiếu điều kiện dừng sẽ khiến hàm gọi mãi không dừng, gây tràn ngăn xếp (RecursionError).
  • Ví dụ kinh điển: tính giai thừa với giai_thua(n) = n * giai_thua(n - 1), điều kiện dừng tại n = 0; hay tính tổng 1 + 2 + ... + n với điều kiện dừng tại n = 1.
  • Đệ quy giúp code ngắn gọn, tự nhiên với các bài toán chia nhỏ được thành bài toán cùng dạng; nhưng mỗi lượt tự gọi phải luôn tiến gần hơn về điều kiện dừng.

Thuật ngữ tiếng Anh trong bài

Tiếng AnhĐọc làNghĩa
recursionri-CƠ-sầnđệ quy
Một hàm tự gọi lại chính nó để giải bài toán nhỏ hơn - giống búp bê Nga: mở ra lại thấy một búp bê giống vậy nhưng nhỏ hơn.
functionPHẮNG-sầnhàm
Một 'cỗ máy nhỏ' lắp sẵn để làm một việc cụ thể.
returnri-TƠNlệnh trả về (return)
Lệnh đưa kết quả từ trong hàm ra ngoài để dùng tiếp - như đưa món ăn nấu xong ra khỏi bếp để mang lên bàn.
base caseBÂY-x KÂY-xđiều kiện dừng
Là trường hợp nhỏ nhất mà hàm đệ quy giải được ngay, không cần gọi lại chính nó nữa.
factorialphác-TO-ri-ơlgiai thừa
Là tích các số từ 1 tới n, viết là n!.

Câu hỏi trắc nghiệm có đáp án

Mấy câu mẫu để bạn tự kiểm tra ngay. Trong ứng dụng, bài này có đủ 24 câu, chấm điểm tự động và giải thích từng câu sai.

Câu 1 · Nhận biết
Đệ quy (recursion), trong lập trình, được hiểu là gì?
  1. Một hàm tự gọi lại CHÍNH NÓ để giải một bài toán nhỏ hơn, cùng dạng với bài toán ban đầu
  2. Một hàm gọi một hàm KHÁC để thực hiện một công việc phụ trợ
  3. Một vòng lặp for được viết lồng bên trong một vòng lặp for khác
  4. Một biến được gán lại giá trị nhiều lần trong cùng một chương trình
Đáp án: A - Đệ quy xảy ra khi một hàm tự gọi lại chính nó - chứ không phải gọi một hàm khác - để giải bài toán nhỏ hơn nhưng cùng dạng với bài toán ban đầu. Vòng lặp lồng nhau và việc gán lại biến là những khái niệm khác, không phải bản chất của đệ quy.
Câu 2 · Nhận biết
Trong một hàm đệ quy, điều kiện dừng (base case) giữ vai trò gì?
  1. Là dòng lệnh dùng để in kết quả cuối cùng ra màn hình
  2. Là tham số đầu tiên được truyền vào hàm ở lượt gọi đầu tiên
  3. Là trường hợp nhỏ nhất, được giải quyết ngay mà không cần gọi lại hàm thêm lần nào nữa
  4. Là lượt gọi hàm được thực hiện nhiều lần nhất trong toàn bộ quá trình đệ quy
Đáp án: C - Điều kiện dừng là trường hợp đơn giản nhất, được trả lời ngay lập tức, không gọi thêm hàm nữa - nhờ đó chuỗi lời gọi đệ quy mới có điểm kết thúc, tránh gọi mãi không dừng. Đây không phải lệnh in kết quả, cũng không phải tham số đầu vào hay lượt gọi bất kì nào khác.
Câu 3 · Thông hiểu
Cho hàm sau. Khi gọi giai_thua(4), hàm trả về giá trị nào?
def giai_thua(n):
    if n == 0:
        return 1
    else:
        return n * giai_thua(n - 1)
  1. 10
  2. 24
  3. 16
  4. Chương trình báo lỗi vì hàm thiếu điều kiện dừng
Đáp án: B - giai_thua(4) = 4 * giai_thua(3) = 4 * (3 * giai_thua(2)) = 4 * 3 * (2 * giai_thua(1)) = 4 * 3 * 2 * (1 * giai_thua(0)). Vì giai_thua(0) chạm điều kiện dừng, trả về 1 ngay, nên kết quả cuối cùng là 4 * 3 * 2 * 1 * 1 = 24. Hàm có đầy đủ điều kiện dừng tại n = 0 nên không hề báo lỗi.
Câu Đúng/Sai (Phần II) · Thông hiểu
Cho biết mỗi phát biểu sau đúng hay sai:
  • a)Mọi hàm đệ quy đều bắt buộc phải có ít nhất một điều kiện dừng (base case).Đúng
  • b)Nếu một hàm đệ quy thiếu điều kiện dừng, hàm đó sẽ tự dừng lại một cách an toàn ngay sau lượt tự gọi đầu tiên.Sai
  • c)Trong hàm tong tính tổng 1 + 2 + ... + n ở bài học, điều kiện dừng ứng với trường hợp n = 1.Đúng
  • d)Đệ quy là cách DUY NHẤT để giải các bài toán như tính tổng hay tính giai thừa; không thể dùng vòng lặp for hoặc while để thay thế.Sai
Vì sao:
  • (a) Đúng - thiếu điều kiện dừng, hàm sẽ tự gọi lại chính nó mãi, không bao giờ kết thúc.
  • (b) Sai - nếu thiếu điều kiện dừng, hàm KHÔNG tự dừng an toàn, mà tiếp tục tự gọi lại chính nó cho đến khi tràn ngăn xếp và chương trình báo lỗi.
  • (c) Đúng - đúng như hàm tong trong bài học, điều kiện dừng được đặt tại trường hợp n = 1, trả về 1 ngay lập tức.
  • (d) Sai - mọi bài toán giải được bằng đệ quy đều có thể viết lại bằng vòng lặp for hoặc while, và ngược lại; đệ quy chỉ là một cách diễn đạt khác, không phải cách duy nhất.

Thử ngay: minh hoạ từng bước

Bấm từng bước để tự xem cơ chế hoạt động, hoặc bấm “Tự chạy” cho nó tiến mỗi giây một lần. Đổi được dữ liệu đầu vào - không cần đăng nhập.

Học trọn bài này trong ứng dụng

Bài giảng đầy đủ, 24 câu luyện tập chấm tự động, thi thử đúng cấu trúc đề tốt nghiệp (24 trắc nghiệm + 4 Đúng/Sai), bài thực hành máy tự chấm và gia sư AI giải thích chỗ sai.

Mở bài 30 trong ứng dụng

Phần học miễn phí, không cần tạo tài khoản.