🧠 Tư duy lập trình
Vòng lặp trong đời thường: từ dấu nhắc lại bản nhạc đến khung dệt
Trong bài
Vòng lặp là cách bảo "làm lại nhóm bước này nhiều lần" thay vì viết đi viết lại từng bước. Dấu nhắc lại trong bản nhạc, câu "khuấy cho tới khi đường tan" trong công thức nấu ăn, hay mẫu hoa văn lặp trên tấm thổ cẩm đều là vòng lặp. Trong lập trình, vòng lặp giúp vài dòng lệnh làm được hàng nghìn, hàng triệu việc giống nhau.
Vì sao cần vòng lặp
Hãy tưởng tượng bạn hướng dẫn một người bước tới cửa lớp, cách đúng mười bước chân. Không có vòng lặp, bạn phải viết:
Bước một bước. Bước một bước. Bước một bước. … và chép đủ mười lần.
Có vòng lặp, chỉ cần một dòng: Lặp lại 10 lần: bước một bước.
Với mười bước thì chép tay vẫn được. Nhưng nếu một chiếc máy phải in số thứ tự lên 5.000 tấm vé, hay kiểm tra từng ảnh trong một album 3.000 tấm, thì không ai viết 5.000 dòng lệnh. Vòng lặp làm chương trình ngắn, dễ đọc, và khi cần sửa thì chỉ sửa ở một chỗ. Muốn đi mười hai bước thay vì mười, chỉ đổi một con số.
Ba kiểu vòng lặp trong đời thường
| Kiểu | Khi nào dừng | Ví dụ đời thường |
|---|---|---|
| Lặp đủ số lần | Khi đã làm đủ số lần định trước | Đập ba quả trứng vào bát; chép mỗi từ mới năm lần; tưới cả mười chậu cây |
| Lặp cho tới khi | Khi một điều kiện trở thành đúng | Khuấy cho tới khi đường tan; gõ cửa cho tới khi có người mở; đun nước cho tới khi sôi |
| Lặp mãi | Không tự dừng, phải có người tắt | Đèn giao thông đổi màu; kim đồng hồ quay; quạt trần chạy |
Kiểu thứ hai rất hay gặp vì nhiều khi ta không biết trước cần bao nhiêu lần. Không ai biết chính xác phải khuấy bao nhiêu vòng thì đường tan, nhưng ai cũng nhìn được lúc đáy cốc hết hạt đường. Người lập trình phân biệt rõ hai kiểu này: biết trước số lần thì dùng kiểu thứ nhất, chỉ biết điều kiện dừng thì dùng kiểu thứ hai.
Kiểu thứ ba nghe như lỗi, nhưng thật ra rất phổ biến. Chiếc điện thoại của bạn lúc nào cũng chạy một vòng lặp: kiểm xem có ai chạm vào màn hình không, có tin nhắn mới không, rồi vẽ lại màn hình, rồi quay lại kiểm tra. Vòng ấy chỉ dừng khi tắt máy.
Vòng lặp trong âm nhạc, dệt vải và đan len
Dấu nhắc lại trong bản nhạc
Nhạc sĩ đã dùng vòng lặp từ trước khi có máy tính hàng trăm năm. Trong bản nhạc, một đoạn được kẹp giữa hai dấu nhắc lại (hai vạch đứng kèm hai chấm) nghĩa là chơi đoạn đó hai lần. Có cả kí hiệu cho biết lần thứ nhất kết thúc kiểu này, lần thứ hai kết thúc kiểu khác. Đó chính là vòng lặp có điều kiện, viết bằng nốt nhạc thay vì chữ.
Khung dệt Jacquard và những tấm thẻ đục lỗ
Năm 1804, thợ dệt người Pháp Joseph Marie Jacquard giới thiệu một chiếc khung dệt điều khiển bằng chuỗi thẻ đục lỗ. Mỗi tấm thẻ ứng với một hàng sợi: chỗ có lỗ thì sợi được nhấc lên, chỗ không có lỗ thì sợi nằm yên. Nối các thẻ thành vòng, khung dệt lặp đi lặp lại cùng một hoa văn suốt chiều dài tấm vải mà thợ không phải tự nhớ. Ý tưởng dùng thẻ đục lỗ để ra lệnh cho máy về sau được Charles Babbage mượn cho chiếc máy tính cơ học ông thiết kế, và thẻ đục lỗ được dùng trong máy tính tới tận những năm 1970.
Ở Việt Nam, người dệt thổ cẩm ở nhiều vùng núi phía Bắc và Tây Nguyên cũng tạo hoa văn bằng cách lặp lại một mẫu nhỏ theo hàng và theo dải. Họ không dùng thẻ, mà giữ mẫu trong trí nhớ và đôi tay, nhưng cách nghĩ thì giống nhau: một mẫu gốc, lặp lại nhiều lần, ghép thành tấm lớn.
Hướng dẫn đan len
Mở một quyển hướng dẫn đan, bạn sẽ gặp những câu như: "Đan hàng 1 và hàng 2 theo mẫu, lặp lại hai hàng này cho tới khi tấm đan dài 20 cm." Đó là một vòng lặp "cho tới khi" chính hiệu, có cả thân vòng lặp (hai hàng) lẫn điều kiện dừng (dài 20 cm).
Vòng lặp lồng nhau: chiếc đồng hồ
Có khi một vòng lặp nằm bên trong vòng lặp khác. Chiếc đồng hồ là ví dụ dễ thấy nhất:
- Kim giây đi 60 bước thì kim phút nhích một bước.
- Kim phút đi 60 bước thì kim giờ nhích một bước.
- Kim giờ đi đủ 12 bước thì quay về vị trí cũ.
Vòng giây nằm trong vòng phút, vòng phút nằm trong vòng giờ. Thử tính: trong một giờ, vòng giây chạy trọn 60 lần, tức 60 × 60 = 3.600 bước. Trong nửa ngày là 12 × 3.600 = 43.200 bước. Chỉ ba vòng lặp lồng nhau đã tạo ra hơn bốn vạn bước.
Bảng cửu chương cũng vậy: vòng ngoài đi từ bảng 2 tới bảng 9, vòng trong đi từ "nhân 1" tới "nhân 10". Tám bảng, mỗi bảng mười dòng, tám mươi dòng tất cả. Hay khi trồng rau: năm luống, mỗi luống mười hốc, mỗi hốc ba hạt. Ba vòng lặp lồng nhau, tổng cộng 150 hạt.
Hai cái bẫy của vòng lặp
Vòng lặp không bao giờ dừng
Nếu điều kiện dừng không bao giờ đúng, vòng lặp chạy mãi. Ví dụ: "Rót nước vào cốc cho tới khi cốc đầy", nhưng cái cốc bị thủng đáy. Người thật sẽ nhận ra và dừng lại. Máy tính thì không: nó rót mãi, chương trình đứng hình. Vì vậy khi viết vòng lặp "cho tới khi", người lập trình luôn tự hỏi: có chắc mỗi lần lặp đều đưa mình lại gần điều kiện dừng hơn không?
Lệch một: bài toán hàng rào
Một hàng rào dài 10 mét, cứ mỗi mét cắm một cọc. Cần bao nhiêu cọc? Nhiều người đáp ngay là 10. Thật ra cần 11, vì phải có cọc ở cả hai đầu. Lỗi "lệch một" này phổ biến tới mức lập trình viên có tên riêng cho nó, và nó là thủ phạm của rất nhiều lỗi phần mềm: vòng lặp chạy thiếu một lần hoặc thừa một lần. Mẹo để tránh là thử với số nhỏ: hàng rào dài 1 mét cần mấy cọc? Hai. Dài 2 mét? Ba. Vậy dài 10 mét cần 11.
Nhận ra vòng lặp là một kỹ năng
Phần khó nhất không phải là viết vòng lặp mà là nhìn ra chỗ nào đang lặp. Một bản hướng dẫn dài thường giấu vòng lặp bên trong. Thử đọc hướng dẫn gấp một ngôi sao giấy hay vẽ một bông hoa năm cánh: "vẽ một cánh, xoay tờ giấy một chút, vẽ một cánh, xoay tờ giấy một chút…". Ai nhìn ra mẫu lặp sẽ viết lại được ngắn gọn: "Lặp lại 5 lần: vẽ một cánh, xoay tờ giấy một phần năm vòng."
Khả năng nhận ra mẫu lặp lại không chỉ có ích trong lập trình. Học sinh giỏi toán thường nhanh ở chỗ nhận ra một bài mới thật ra giống bài cũ. Người nấu ăn giỏi nhận ra món mới chỉ là một biến thể của món quen.
Thử làm: điệu nhảy viết bằng thẻ
Làm theo nhóm hoặc cả nhà, khoảng 20 phút.
Chuẩn bị
- Khoảng 20 tấm bìa cỡ bàn tay. Viết lên mỗi tấm một động tác: vỗ tay, dậm chân trái, dậm chân phải, xoay một vòng, giơ hai tay, ngồi xuống đứng lên.
- Vài tấm đặc biệt ghi "Lặp lại 2 lần", "Lặp lại 3 lần", và hai sợi dây len để quây các thẻ lại thành nhóm.
Cách làm
- Xếp các thẻ động tác thành một hàng trên sàn để tạo một điệu nhảy dài khoảng mười động tác. Cả nhóm cùng làm theo.
- Tìm đoạn nào trong hàng đang lặp lại y hệt. Dùng dây len quây đoạn đó lại, đặt thẻ "Lặp lại" phía trước, rồi bỏ bớt các thẻ thừa.
- Đếm xem bản mới dùng ít hơn bao nhiêu thẻ mà điệu nhảy vẫn y nguyên.
- Thử một vòng lặp lồng: quây một nhóm thẻ đã có vòng lặp bên trong, đặt thêm thẻ "Lặp lại 2 lần" ở ngoài. Đoán trước xem tổng cộng phải vỗ tay mấy lần, rồi nhảy thử để kiểm tra.
Biến thể yên tĩnh hơn: xâu vòng tay bằng hạt cườm theo mẫu lặp, ví dụ "lặp lại cho tới khi đủ dài quanh cổ tay: hai hạt đỏ, một hạt vàng". Hạt nhỏ nên cất xa tầm tay em bé dưới ba tuổi.
Câu hỏi thường gặp
Vòng lặp trong lập trình là gì?
Vòng lặp là một câu lệnh cho máy tính làm lại một nhóm bước nhiều lần, thay vì người viết phải chép lại các bước ấy. Vòng lặp có thể chạy đủ một số lần định trước, chạy cho tới khi một điều kiện đúng, hoặc chạy mãi cho tới khi bị dừng.
Ví dụ vòng lặp trong đời sống hằng ngày?
Khuấy cho tới khi đường tan, đánh răng đủ các mặt răng, đèn giao thông đổi màu theo chu kỳ, kim đồng hồ quay, đoạn nhạc có dấu nhắc lại, hướng dẫn đan len "lặp lại hai hàng cho tới khi đủ dài". Hầu như việc gì có chữ "lặp lại" hoặc "cho tới khi" đều chứa một vòng lặp.
Vòng lặp vô tận là gì, có phải lúc nào cũng là lỗi?
Vòng lặp vô tận là vòng lặp không bao giờ tự dừng. Nếu người viết quên điều kiện dừng thì đó là lỗi, chương trình sẽ treo. Nhưng nhiều thiết bị cố ý chạy vòng lặp vô tận, như đèn giao thông hay điện thoại liên tục kiểm tra màn hình, và chỉ dừng khi bị tắt.
Lỗi lệch một là gì?
Lỗi lệch một là khi vòng lặp chạy thừa hoặc thiếu đúng một lần. Ví dụ quen thuộc là hàng rào 10 mét cắm cọc mỗi mét cần 11 cọc chứ không phải 10. Cách tránh là thử với vài số nhỏ trước để kiểm tra quy luật.
Vòng lặp lồng nhau là gì?
Đó là khi một vòng lặp nằm bên trong một vòng lặp khác. Chiếc đồng hồ là ví dụ: vòng giây nằm trong vòng phút, vòng phút nằm trong vòng giờ. Số lần làm tổng cộng bằng tích số lần của từng vòng.
vòng lặplặp cho tới khivòng lặp lồng nhaukhung dệt Jacquardthẻ đục lỗthổ cẩmlỗi lệch mộtbài toán hàng ràotư duy máy tính