Các vòng lặp for
này là một trong những ví dụ cơ bản đầu tiên về bằng chứng chính xác về thuật toán. Họ có điều kiện chấm dứt khác nhau nhưng tương đương:Điều kiện kết thúc vòng lặp
1 for (int i = 0; i != N; ++i)
2 for (int i = 0; i < N; ++i)
Sự khác biệt trở nên rõ ràng trong postconditions:
Người đầu tiên đưa ra đảm bảo mạnh mẽ rằng
i == N
sau khi vòng lặp kết thúc.Điều thứ hai chỉ đảm bảo yếu kém rằng
i >= N
sau khi vòng kết thúc chấm dứt, nhưng bạn sẽ bị cám dỗ giả định rằngi == N
.
Nếu vì lý do nào đó tăng ++i
là bao giờ thay đổi một cái gì đó giống như i += 2
, hoặc nếu i
bị biến đổi bên trong vòng lặp, hoặc nếu N
là tiêu cực, chương trình có thể thất bại:
Các người đầu tiên có thể bị mắc kẹt trong một vòng lặp vô hạn. Nó không thành công sớm, trong vòng lặp có lỗi. Gỡ lỗi thật dễ dàng.
Vòng lặp thứ hai sẽ kết thúc và sau đó chương trình có thể không thành công do giả định không chính xác của bạn là
i == N
. Nó có thể thất bại từ vòng lặp gây ra lỗi, làm cho nó khó khăn để theo dõi trở lại. Hoặc nó có thể âm thầm tiếp tục làm điều gì đó bất ngờ, thậm chí còn tồi tệ hơn.
Bạn muốn điều kiện chấm dứt nào và tại sao? Có cân nhắc nào khác không? Tại sao nhiều lập trình viên biết điều này, từ chối áp dụng nó?
Đối với những người đã đề cập rằng tôi không có sẵn bên ngoài cho, nó là hữu ích để lưu ý rằng giá trị của tôi lúc chấm dứt có thể được sử dụng khi lý luận về chương trình. Ví dụ: nếu bạn muốn thiết lập P (N) với một vòng lặp duy trì P bất biến (i), thì i == N cho bạn P (N) trong khi i> = N thì không. – mweerden
+1 cho câu hỏi được viết rõ ràng thể hiện rõ giá trị của từng tùy chọn. –