[Tự học C++] Phần 15: Hàm Đệ Quy trong C++
7/13/2023 10:05:32 AM
tientran21121 ...

I. Từ Quy nạp Toán học...

Đầu tiên, chúng ta hãy xem xét bài toán chứng minh sau: Chứng minh rằng đẳng thức dưới đây đúng với mọi số tự nhiên n:

1 + 3 + 5 + ⋯ + (2n-1) = n^2 (1)

Ở trình độ trung học cơ sở, chúng ta đã được học về phương pháp quy nạp toán học dùng để chứng minh một đẳng thức hoặc bất đẳng thức. Áp dụng phương pháp này, chúng ta có thể giải quyết bài toán trên một cách dễ dàng:

Bước 1: Chứng minh đẳng thức đúng với n=1: Ta thấy 1 = 1^2, do đó đẳng thức đúng với n=1.

Bước 2: Lập giả thiết quy nạp - Giả sử đẳng thức đúng với n=k≥1: Tức là ta có: 1 + 3 + 5 + ⋯ + (2k-1) = k^2 (2).

Bước 3: Ta chứng minh đẳng thức đúng với n=k+1, tức là cần chứng minh: 1 + 3 + 5 + ⋯ + (2k-1) + (2(k+1)-1) = (k+1)^2 (3).

Để chứng minh đẳng thức (3), chúng ta sẽ sử dụng giả thiết đẳng thức (2). Thực hiện các phép biến đổi:

1 + 3 + 5 + ⋯ + (2k-1) + (2(k+1)-1) = k^2 + (2(k+1)-1) (thay thế giả thiết đẳng thức (2)) = k^2 + 2k + 2 - 1 = k^2 + 2k + 1 = (k+1)^2.

Vậy, từ giả thiết đẳng thức (2), chúng ta đã chứng minh được đẳng thức (3) đúng với n=k+1.

Nhờ phương pháp quy nạp, chúng ta đã chứng minh được rằng đẳng thức (1) đúng với mọi số tự nhiên n.

II. Giải thuật đệ quy

Bài toán P được gọi là có tính chất đệ quy khi lời giải của nó có thể được chuyển thành lời giải của bài toán P' nhỏ hơn và có cùng cấu trúc với nó, đồng thời lời giải của P' không phụ thuộc vào P. Các lời giải cho những bài toán như vậy được gọi là giải thuật đệ quy. Bản chất của giải thuật đệ quy là phân tách một bài toán lớn thành các bài toán nhỏ hơn và dễ giải hơn, sau đó kết hợp các lời giải của các bài toán nhỏ lại để tạo thành lời giải cho bài toán lớn ban đầu. Bài toán tìm giai thừa của n là một ví dụ cơ bản cho các bài toán có tính chất đệ quy.

Quy nạp toán học và giải thuật đệ quy có mối quan hệ chặt chẽ: Trong quy nạp toán học, chúng ta chứng minh tính chất toán học bằng cách chứng minh rằng nó đúng với các trường hợp cơ sở sau đó dựa trên điều này chứng minh rằng nó đúng với mọi số tự nhiên n dựa trên việc nó đã đúng với các số tự nhiên nhỏ hơn n. Tương tự, trong giải thuật đệ quy, chúng ta tìm lời giải cho các bài toán cơ sở (thường rất đơn giản), sau đó cài đặt để lời giải của bài toán lớn được suy ra từ lời giải của các bài toán nhỏ hơn cùng cấu trúc.

III. Công thức truy hồi

Sau khi phân tách bài toán có tính chất đệ quy thành các bài toán nhỏ hơn, chúng ta có hai nhiệm vụ:

  1. Tìm lời giải cho các bài toán cơ sở.
  2. Kết hợp lời giải của các bài toán con thành lời giải cho bài toán lớn.

Bước thứ nhất thường đơn giản vì các bài toán cơ sở có kích thước nhỏ và dễ giải. Tuy nhiên, bước thứ hai đòi hỏi tư duy nhiều hơn. Công thức truy hồi được sử dụng để liên kết các bài toán nhỏ với bài toán lớn. Trong toán học, có nhiều định nghĩa về công thức truy hồi. Ví dụ:

Xác định công thức truy hồi của một bài toán đệ quy là quyết định quan trọng để có thể giải bài toán đó. Lời giải đệ quy có thể được thực hiện bằng cách cài đặt đệ quy hoặc cài đặt không đệ quy. Trên phần tiếp theo, chúng ta sẽ tìm hiểu cách cài đặt các hàm đệ quy để giải các bài toán có tính chất đệ quy.

IV. Hàm đệ quy và các thành phần của hàm đệ quy

1. Khái niệm về hàm đệ quy

Các lời giải đệ quy cho một bài toán có thể được ghi lại trong một hàm gọi là hàm đệ quy. Một hàm đệ quy có đặc điểm là luôn gọi lại chính nó (thực tế, bài toán đệ quy cũng là việc giải lại bài toán gốc nhưng với kích thước nhỏ hơn):

Một cách dễ hiểu nhất, chúng ta có thể tưởng tượng hàm đệ quy như một vòng lặp. Tương tự như vòng lặp, hàm đệ quy sẽ lặp lại việc thực hiện đoạn mã bên trong nó một số lần cụ thể. Tuy nhiên, khác với vòng lặp, hàm đệ quy gọi lại chính nó để thực hiện các lần lặp tiếp theo. Hàm đệ quy có thể được hiểu như một loại vòng lặp "tự thân" hoạt động bằng cách gọi lại chính nó để tiếp tục thực hiện các bước trong quá trình giải quyết bài toán.

2. Các thành phần của một hàm đệ quy

Một hàm đệ quy luôn bao gồm hai phần chính:

Phần cơ sở (base case): Đây là lời giải cho bài toán cơ sở, và đồng thời thể hiện tính dừng của thuật toán. Khi hàm đệ quy gọi lại chính nó tới một thời điểm nhất định, phần cơ sở sẽ được thực hiện. Phần cơ sở giải quyết bài toán một cách trực tiếp mà không cần phải dựa vào bất kỳ bài toán con nào. Nó thường là một phần rất đơn giản và đạt được kết quả trực tiếp.

Phần đệ quy (recursive part): Trong trường hợp bài toán không thể được giải bằng phần cơ sở, ta xác định các bài toán con và gọi đệ quy tới các bài toán con đó để giải chúng. Sau khi có lời giải của các bài toán con, ta sẽ kết hợp chúng lại bằng công thức truy hồi để có được lời giải cho bài toán gốc. Phần này thể hiện tính quy nạp của thuật toán, vì lời giải của bài toán gốc phụ thuộc vào lời giải của các bài toán con nhỏ hơn.

Tổng hợp hai phần này, hàm đệ quy sẽ tiến hành giải quyết bài toán thông qua việc giải quyết bài toán cơ sở hoặc gọi đệ quy tới các bài toán con, tùy thuộc vào tính dừng và tính quy nạp của thuật toán.

3. Cơ chế hoạt động của một hàm đệ quy

Ta lấy một ví dụ là hàm đệ quy tính n! như sau:

Vẫn còn nội dung phía dưới, bạn hãy ấn nút để xem tiếp nhé...