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!

Lua - Iterators

Đệ 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ới ipairs, đâ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ị maxcurrent.
  • 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