thực sự là một điều kiện hậu của vòng lặp while (tại sao bạn nghĩ rằng nó rõ ràng không phải là trường hợp?). Đây luôn là trường hợp với một vòng lặp while mà không chứa một: khi thoát vòng lặp, nó chỉ có thể là do điều kiện lặp (ở đây, u + 1 ≠ v ) là sai. Đây không phải là điều duy nhất đúng khi vòng lặp thoát ra ở đây (thuật toán này thực sự tính toán một điều thú vị, như bạn đã thấy trong lớp của mình, vì vậy u = [điều thú vị này] và v = [điều thú vị này] cũng là điều kiện hậu ), nhưng nó là rõ ràng nhất.u + 1 = vbreak
u + 1 ≠ vu = [điều thú vị này]v = [điều thú vị này]
Bây giờ, để tìm các thuộc tính thú vị khác, không có công thức chung. Trong thực tế, có một số ý nghĩa chính thức trong đó không có công thức chung để tìm bất biến vòng lặp. Điều tốt nhất bạn có thể làm là áp dụng một số kỹ thuật chỉ hoạt động trong một số trường hợp, hoặc nói chung là đi câu cá cho những quan sát thú vị (hoạt động tốt hơn và tốt hơn khi bạn có nhiều kinh nghiệm hơn).
Nếu bạn chạy vòng lặp cho một vài lần lặp với một số giá trị , bạn sẽ thấy điều đó ở mỗi lần lặp:n
- hoặc nhảy lên ( u + v ) / 2 ;bạn( u + v ) / 2
- hoặc nhảy xuống ( u + v ) / 2 .v( u + v ) / 2
Cụ thể, bắt đầu ít hơn v , và sẽ không bao giờ vượt qua nó. Hơn nữa, u bắt đầu dương và tăng, trong khi v bắt đầu ở n + 1 và giảm. Vì vậy, 0 ≤ u ≤ v ≤ n + 1 là một bất biến trong suốt chương trình này.bạnvbạnvn + 10 ≤ u ≤ v ≤ n + 1
Một điều không quá rõ ràng là liệu có thể bằng v . Điều đó quan trọng: nếu u và v trở nên bằng nhau, chúng ta sẽ có x = u = v và vòng lặp sẽ tiếp tục tồn tại. Vì vậy, bạn cần chứng minh rằng u và v không bao giờ trở nên bằng nhau để chứng minh rằng thuật toán là chính xác (nghĩa là không lặp mãi mãi). Khi nhu cầu này đã được xác định, thật dễ dàng để chứng minh (tôi sẽ bỏ qua điều này như một bài tập) rằng u < v là một bất biến vòng lặp (hãy nhớ rằng u và v là các số nguyên, vì vậy điều này tương đương với bạnbạnvbạnvx = u = vbạnvbạn < vbạnvu + 1 ≤ v
v = u + 1bạn2≤N < v20 ≤ u2nnn
- u ≤ x ≤ v
- khi , chúng ta chọn u tiếp theo là x , sao cho u 2 ≤ n (và v không thay đổi);x2≤ nbạnxbạn2≤ nv
- khi , chúng ta chọn v tiếp theo là x , sao cho n < v 2 (và bạn không thay đổi).x2> nvxn < v2bạn
Sự phân đôi này gợi ý rằng có thể . Nói cách khác, chúng tôi nghi ngờ rằng đó là một bất biến vòng lặp. Xác minh điều này được để lại như một bài tập cho người đọc (hãy nhớ kiểm tra xem tài sản đó có đúng ban đầu không).bạn2< N < v2
Và bây giờ chúng ta đã thực hiện tất cả những điều này, chúng ta thấy rằng và ( u + 1 ) 2 > n : u là căn bậc hai của n được làm tròn xuống số nguyên gần nhất.bạn2≤ n( u + 1 )2> nbạnn