Loop

Duy Văn | 06/03/2025


Vòng lặp là khái niệm quen thuộc trong lập trình, các kiểu vòng lặp cơ bản nhất chúng ta hay có là:

  • Vòng lặp while - thực hiện khối lệnh liên tục nhiều lần miễn là điều kiện đưa ra thoả mãn
  • Vòng lặp do while - thực hiện khối lệnh liên tục nhiều lần ít nhất một lần, sau đó kiểm tra điều kiện
  • Vòng lặp for - thực hiện khối lệnh liên tục nhiều lần với số lần lặp cố định

While

Cú pháp vòng lặp while rất đơn giản, syntax như sau:

while (condition){
    // code block to be executed
}
  • Điều kiện được đánh giá trước mỗi vòng lặp
  • Nếu điều kiện thoả mãn, vòng lặp được thực hiện 1 lần
  • Nếu điều kiện không thoả mãn, vòng lặp dừng lại và code sẽ chạy tiếp

Như với tất cả các vòng lặp while ở các ngôn ngữ khác, while của java cũng có thể bị dính vòng lặp vô hạn nếu không cẩn thận

Một lưu ý nữa là vòng lặp while bản chất có thể bắt chước vòng lặp for

int i = 0;
while (i < 10){
  // do something
  i ++;
}

Lưu ý thứ hai là vòng lặp while tuy có thể được thực hiện vô hạn với cấu trúc

while (true){
  // do something
}

Nhưng ngược lại, không thể compile được cấu trúc while (false), nó sẽ sinh ra lỗi error: unreachable statement, vì bản chất codeblock phía trong while(false) sẽ không thể được thực hiện dù gì đi nữa, nên compiler báo lỗi để chúng ta biết rằng có các statement không thể đạt được. Chỉ khi nào cấu trúc điều kiện có thể thay đổi từ false -> true, tức là không phải constant thì compiler sẽ bỏ qua

while (false){
  // this will not run, ever
}

Một vấn đề nữa mình muốn đề cập là nên né việc sử dụng điều kiện là boolean expression dạng so sánh giá trị với dấu =. Ví dụ while (x != 5.0) sẽ rất không ổn do tính chính xác của floating-point, x có thể sẽ không bao giờ chính xác bằng 5.0 nên vòng lặp sẽ không thể dừng, cân nhắc sử dụng while (x < 5.0) hoặc while (x > 5.0) thay vì so sánh bằng

Ví dụ

double x = 0.1;
while (x != 5.0){ // Cực kỳ không ổn, khả năng cao là infinite loop
  x += 0.1; 
}

while (x < 5.0){ // ổn
  x += 0.1; 
}

Do While

Một sự khác biệt cơ bản của Do While so với While đó là vòng lặp đầu tiên sẽ được thực hiện, sau đó nó mới check đến điều kiện, nếu điều kiện vẫn còn đúng thì vòng lặp sẽ tiếp tục được chạy, cú pháp như sau:

do {
  // code block to be executed at least once
} while (condition);

Vì codeblock sẽ được chạy lần đầu nên cần rất cẩn thận khi sử dụng cấu trúc Do While

Nó cũng sẽ không gặp lỗi error: unreachable statment như while khi sử dụng điều kiện false dạng constant do nó chạy ít nhất một lần

Lưu ý syntax của Do While, sau while (condition) buộc phải có dấu ;

For

Vòng lặp for là cấu túc vòng lặp cơ bản, bên phía Python nó khá dễ khi việc tự đếm số lần thực hiện vòng lặp được tự động, nhung ở phía Java hay tương tự ở phía C++ chúng ta cần cấu trúc đầy đủ:

for (statement 1; statement 2; statement 3) {
  // code block to be executed
}
  • statement 1 được thực hiện 1 lần trước khi chạy vòng lặp
  • statement 2 định nghĩa điều kiện để thực hiện vòng lặp
  • statement 3 được thực hiện mỗi khi một vòng lặp kết thúc

Vậy thì logic sử dụng các statement sẽ như sau:

  • statement 1 là để khai báo một giá trị bộ đếm
  • statement 2 là định nghĩa điều kiện thực hiện vòng lặp dựa trên bộ đếm
  • statement 3 là để điều chỉnh giá trị bộ đếm

Ví dụ

for (int i = 0; i < 5; i++) {
  // do something
}

Nested Loop

Nested loop về cơ bản là lồng một vòng lặp vào trong vòng lặp khác, số lần thực hiện vòng lặp thực tế sẽ là tích của số lần thực hiện của các vòng lặp lồng vào nhau

for (int i = 0; i < 5; i++) {
  // statement 1
  for (int j = 0; j < 5; j++) {
    // statement 2
  }
}

Ở đây tổng cộng sẽ có 25 lần thực hiện vòng lặp cho các statement ở statement 2, còn ở statement 1 sẽ thực hiện 5 lần

For Each

Một For rất hữu dụng trong Java để iterate qua một array chính là For Each, nó cũng hữu dụng tương tự như for ele in list ở Python

for (type variableName : arrayName) {
  // code block to be executed
}

Ví dụ

String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
for (String i : cars) {
  System.out.println(i);
}

Break and Continue

Các statement như break và continue sinh ra để điều khiển flow của vòng lặp, nó hoạt động y hệt break và continue bên Python

  • break sẽ dừng vòng lặp ngay lập tức
  • continue sẽ bỏ qua phần còn lại của vòng lặp và chuyển đến vòng lặp tiếp theo