Hãy xem xét một vấn đề cũ, nổi tiếng :
Trong toán học, ước chung lớn nhất (gcd)… của hai hoặc nhiều số nguyên khác 0, là số nguyên dương lớn nhất chia các số không có dư.
Định nghĩa của gcd rất đơn giản:
trong đó mod là toán tử modulo (nghĩa là phần còn lại sau khi chia số nguyên).
Trong tiếng Anh, định nghĩa này nói ước chung lớn nhất của bất kỳ số nào và số 0 là số đó, và ước chung lớn nhất của hai số m và n là ước chung lớn nhất của n và số còn lại sau khi chia m cho n .
Nếu bạn muốn biết tại sao điều này hoạt động, hãy xem bài viết trên Wikipedia về thuật toán Euclide .
Hãy tính gcd (10, 8) làm ví dụ. Mỗi bước bằng với bước ngay trước nó:
- gcd (10, 8)
- gcd (10, 10 mod 8)
- gcd (8, 2)
- gcd (8, 8 mod 2)
- gcd (2, 0)
- 2
Trong bước đầu tiên, 8 không bằng 0, vì vậy áp dụng phần thứ hai của định nghĩa. 10 mod 8 = 2 vì 8 chuyển thành 10 một lần với phần dư là 2. Ở bước 3, áp dụng phần thứ hai một lần nữa, nhưng lần này 8 mod 2 = 0 vì 2 chia 8 không có dư. Ở bước 5, đối số thứ hai là 0, vì vậy câu trả lời là 2.
Bạn có nhận thấy rằng gcd xuất hiện ở cả bên trái và bên phải của dấu bằng không? Một nhà toán học có thể nói định nghĩa này là đệ quy vì sự biểu hiện bạn đang xác định tái phát bên trong định nghĩa của nó.
Các định nghĩa đệ quy có xu hướng thanh lịch. Ví dụ, một định nghĩa đệ quy cho tổng của một danh sách là
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
đâu head
là phần tử đầu tiên trong danh sách và tail
là phần còn lại của danh sách. Lưu ý rằng sum
lặp lại bên trong định nghĩa của nó ở cuối.
Có thể bạn muốn giá trị lớn nhất trong danh sách thay vào đó:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
Bạn có thể định nghĩa phép nhân các số nguyên không âm một cách đệ quy để biến nó thành một loạt các phép cộng:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Nếu phần biến đổi phép nhân thành một loạt phép cộng không có ý nghĩa, hãy thử mở rộng một vài ví dụ đơn giản để xem nó hoạt động như thế nào.
Merge sort có một định nghĩa đệ quy đáng yêu:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Các định nghĩa đệ quy đều có sẵn nếu bạn biết những gì cần tìm. Lưu ý rằng tất cả các định nghĩa này đều có các trường hợp cơ sở rất đơn giản, ví dụ: gcd (m, 0) = m. Các trường hợp đệ quy xoay quanh vấn đề để đi đến câu trả lời dễ dàng.
Với sự hiểu biết này, bây giờ bạn có thể đánh giá cao các thuật toán khác trong bài viết của Wikipedia về đệ quy !