Lua - Đệ quy: Hướng dẫn cho người mới bắt đầu
Xin chào, các nhà lập trình Lua tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các đệ quy Lua. Đừng lo lắng nếu bạn mới bắt đầu lập trình - tôi sẽ là hướng dẫn viên thân thiện của bạn, và chúng ta sẽ cùng nhau bước từng bước. Cuối cùng của bài hướng dẫn này, bạn sẽ đệ quy như một chuyên gia!
Đệ quy là gì?
Trước khi chúng ta bắt đầu, hãy hiểu đệ quy là gì. Hãy tưởng tượng bạn có một giỏ táo, và bạn muốn kiểm tra từng quả táo một. Một đệ quy giống như một bàn tay kỳ diệu giúp bạn picking up từng quả táo một, mà không cần bạn phải lo lắng về số lượng táo trong giỏ hoặc cách chúng được sắp xếp.
Trong lập trình, các đệ quy là các đối tượng cho phép chúng ta duyệt qua tất cả các phần tử trong một bộ sưu tập (như mảng hoặc bảng trong Lua) mà không cần biết cấu trúc cơ bản của bộ sưu tập đó.
Bây giờ, hãy cùng khám phá các loại đệ quy khác nhau trong Lua!
Đệ quy.Generic For
Vòng lặp generic for là cách phổ biến nhất để sử dụng các đệ quy trong Lua. Nó đơn giản, thanh lịch và mạnh mẽ. Hãy bắt đầu với một ví dụ cơ bản:
local fruits = {"apple", "banana", "orange", "grape"}
for i, fruit in ipairs(fruits) do
print(i .. ": " .. fruit)
end
Nếu bạn chạy đoạn mã này, bạn sẽ thấy:
1: apple
2: banana
3: orange
4: grape
Hãy phân tích nó:
- Chúng ta tạo một bảng (mảng) của các loại quả.
- Chúng ta sử dụng vòng lặp
for
vớiipairs
, đây là một hàm đệ quy tích hợp. -
i
là chỉ số, vàfruit
là giá trị tại chỉ số đó. - Vòng lặp tự động dừng lại khi nó đến cuối bảng.
Đó có phải không? Nó giống như bàn tay kỳ diệu của chúng ta đang picking up từng quả và nói cho chúng ta biết vị trí của chúng trong giỏ!
Ví dụ khác: Đệ quy qua một từ điển
Hãy thử một điều gì đó khác biệt:
local person = {name = "Alice", age = 30, job = "Developer"}
for key, value in pairs(person) do
print(key .. " = " .. value)
end
Điều này sẽ xuất ra:
name = Alice
age = 30
job = Developer
Ở đây, chúng ta sử dụng pairs
thay vì ipairs
. pairs
rất hữu ích cho các bảng không chỉ là danh sách đơn giản, như bảng person
của chúng ta.
Đệ quy không giữ trạng thái
Bây giờ, hãy nâng cấp một chút. Các đệ quy không giữ trạng thái là các hàm không giữ bất kỳ trạng thái nào giữa các cuộc gọi. Chúng đơn giản và hiệu quả. Dưới đây là một ví dụ:
function square(max, current)
current = current or 0
if current >= max then
return nil
end
return current + 1, (current + 1)^2
end
for i, squared in square, 5 do
print(i .. " squared is " .. squared)
end
Điều này sẽ xuất ra:
1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16
5 squared is 25
Hãy phân tích nó:
- Chúng ta định nghĩa một hàm
square
nhận giá trịmax
vàcurrent
. - Hàm trả về số tiếp theo và bình phương của nó, hoặc
nil
khi chúng ta đã xong. - Trong vòng lặp
for
, chúng ta sử dụng hàm này trực tiếp như một đệ quy.
Nó giống như có một máy tính cho chúng ta số bình phương tiếp theo mỗi khi chúng ta nhấn nút!
Đệ quy giữ trạng thái
Cuối cùng, hãy nói về các đệ quy giữ trạng thái. Đây là những đệ quy phức tạp hơn nhưng cũng mạnh mẽ hơn. Chúng nhớ trạng thái của mình giữa các cuộc gọi. Dưới đây là một ví dụ:
function fibonacci(n)
local count = 0
local a, b = 0, 1
return function()
if count < n then
count = count + 1
a, b = b, a + b
return count, a
end
end
end
for i, fib in fibonacci(10) do
print("The " .. i .. "th Fibonacci number is " .. fib)
end
Điều này sẽ xuất ra các số Fibonacci đầu tiên:
The 1th Fibonacci number is 1
The 2th Fibonacci number is 1
The 3th Fibonacci number is 2
The 4th Fibonacci number is 3
The 5th Fibonacci number is 5
The 6th Fibonacci number is 8
The 7th Fibonacci number is 13
The 8th Fibonacci number is 21
The 9th Fibonacci number is 34
The 10th Fibonacci number is 55
Đệ quy này giống như một nhà máy số Fibonacci nhỏ. Mỗi lần chúng ta gọi nó, nó nhớ nơi nó dừng lại và cho chúng ta số tiếp theo trong chuỗi.
Kết luận
Và đó là tất cả! Chúng ta đã khám phá thế giới của các đệ quy Lua, từ vòng lặp generic for đơn giản đến các đệ quy giữ trạng thái phức tạp hơn. Nhớ rằng, thực hành làm nên hoàn hảo. Hãy thử tạo các đệ quy của riêng bạn cho các chuỗi hoặc cấu trúc dữ liệu khác nhau.
Dưới đây là bảng tham khảo nhanh các hàm đệ quy chúng ta đã sử dụng:
Hàm | Mô tả | Trường hợp sử dụng |
---|---|---|
ipairs() | Đệ quy qua các bảng array-like | Cho danh sách đánh số |
pairs() | Đệ quy qua tất cả các phần tử của bảng | Cho từ điển hoặc bảng hỗn hợp |
Hàm tùy chỉnh | Có thể không giữ hoặc giữ trạng thái | Cho chuỗi đặc biệt hoặc đệ quy phức tạp |
Chúc các bạn lập trình vui vẻ, và may mắn với các đệ quy của bạn!
Credits: Image by storyset