u+1=v memang post-kondisi dari loop sementara (mengapa Anda pikir itu "jelas" bukan itu masalahnya?). Ini selalu terjadi dengan loop sementara yang tidak mengandung a break
: ketika loop keluar, itu hanya bisa karena kondisi loop (di sini, ) salah. Bukan satu-satunya hal yang akan menjadi kenyataan ketika loop keluar di sini (algoritma ini sebenarnya menghitung sesuatu yang menarik, seperti yang Anda lihat di kelas Anda, jadi dan juga post-kondisi), tetapi itu adalah yang paling jelas.u+1≠vu=[this interesting thing]v=[this interesting thing]
Sekarang, untuk menemukan properti menarik lainnya, tidak ada resep umum. Bahkan, ada beberapa pengertian formal di mana tidak ada resep umum untuk menemukan invarian loop. Yang terbaik yang dapat Anda lakukan adalah menerapkan beberapa teknik yang hanya berfungsi dalam beberapa kasus, atau biasanya memancing untuk pengamatan yang menarik (yang bekerja lebih baik dan lebih baik saat Anda semakin berpengalaman).
Jika Anda menjalankan loop untuk beberapa iterasi dengan nilai , Anda akan melihat itu di setiap iterasi:n
- baik melompat ke ;u(u+v)/2
- atau melompat ke .v(u+v)/2
Secara khusus, memulai kurang dari , dan tidak akan pernah menyalipnya. Selanjutnya, mulai positif dan meningkat, sedangkan dimulai pada dan menurun. Jadi adalah invarian di seluruh program ini.uvuvn+10≤u≤v≤n+1
Satu hal yang tidak begitu jelas adalah apakah bisa sama dengan . Itu penting: jika dan pernah menjadi sama, kita akan memiliki dan loop akan terus berjalan selamanya. Jadi, Anda perlu membuktikan bahwa dan tidak pernah menjadi sama untuk membuktikan bahwa algoritma tersebut benar (yaitu tidak berulang selamanya). Setelah kebutuhan ini telah diidentifikasi, mudah untuk membuktikan (saya meninggalkan ini sebagai latihan) bahwa adalah invarian loop (perlu diingat bahwa dan adalah bilangan bulat, jadi ini setara dengan ).uvuvx=u=vuvu<vuvu+1≤v
Karena pada akhir program, post-kondisi yang diberikan kepada Anda juga dapat ditulis (bagian sepele). Alasan kami menginginkan post-kondisi seperti ini, yang melibatkan , adalah bahwa kami ingin mengikat hasil program dengan input . Kenapa kondisinya tepat seperti ini? Kami sedang mencari sesuatu yang setepat mungkin, dan kami melihat di mana muncul di dalam loop:v=u+1u2≤n<v20≤u2nnn
- kami memiliki ;u≤x≤v
- ketika , kita memilih berikutnya menjadi , sehingga (dan tidak berubah);x2≤nuxu2≤nv
- ketika , kita memilih berikutnya menjadi , sehingga (dan tidak berubah).x2>nvxn<v2u
Petunjuk dikotomi ini bahwa mungkin sepanjang waktu. Dengan kata lain, kami menduga itu loop invarian. Memverifikasi ini dibiarkan sebagai latihan untuk pembaca (ingat untuk memeriksa bahwa properti itu benar pada awalnya).u2≤n<v2
Dan sekarang setelah kita melakukan semua ini, kita melihat bahwa dan : adalah akar kuadrat dari dibulatkan ke bilangan bulat terdekat.( u + 1 ) 2 > n u nu2≤n(u+1)2>nun