let x = 0
let y = 0
let d = 1
let m = 1
while true
while 2 * x * d < m
print(x, y)
x = x + d
while 2 * y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 1
Ada banyak solusi yang diusulkan untuk masalah ini yang ditulis dalam berbagai bahasa pemrograman namun mereka semua tampaknya berasal dari pendekatan yang berbelit-belit. Saya akan mempertimbangkan masalah yang lebih umum dari komputasi spiral yang dapat diekspresikan secara ringkas menggunakan induksi.
Kasing dasar: Mulai dari (0, 0), bergerak maju 1 kotak, belok kiri, maju 1 kotak, belok kiri. Langkah induktif: Bergerak maju n + 1 kotak, belok kiri, bergerak maju n + 1 kotak, belok kiri.
Keanggunan matematis untuk mengungkapkan masalah ini sangat menyarankan harus ada algoritma sederhana untuk menghitung solusinya. Dengan mengingat abstraksi, saya memilih untuk tidak mengimplementasikan algoritma dalam bahasa pemrograman tertentu tetapi lebih sebagai pseudo-code.
Pertama saya akan mempertimbangkan algoritma untuk menghitung hanya 2 iterasi spiral menggunakan 4 pasang while loop. Struktur masing-masing pasangan serupa, namun berbeda dalam dirinya sendiri. Ini mungkin tampak gila pada awalnya (beberapa loop hanya dieksekusi sekali) tetapi langkah demi langkah saya akan melakukan transformasi sampai kita tiba di 4 pasang loop yang identik dan karenanya dapat diganti dengan satu pasang ditempatkan di dalam loop lain. Ini akan memberi kami solusi umum komputasi dan iterasi tanpa menggunakan persyaratan apa pun.
let x = 0
let y = 0
//RIGHT, UP
while x < 1
print(x, y)
x = x + 1
while y < 1
print(x, y)
y = y + 1
//LEFT, LEFT, DOWN, DOWN
while x > -1
print(x, y)
x = x - 1
while y > -1
print(x, y)
y = y - 1
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x < 2
print(x, y)
x = x + 1
while y < 2
print(x, y)
y = y + 1
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x > -2
print(x, y)
x = x - 1
while y > -2
print(x, y)
y = y - 1
Transformasi pertama yang akan kita buat adalah pengenalan variabel baru d, untuk arah, yang memiliki nilai +1 atau -1. Arah beralih setelah setiap pasangan loop. Karena kita mengetahui nilai d pada semua titik, kita dapat mengalikan setiap sisi dari setiap ketidaksetaraan dengan itu, menyesuaikan arah ketidaksetaraan sesuai dan menyederhanakan setiap perkalian dari d dengan konstanta ke konstanta lain. Ini meninggalkan kita dengan yang berikut ini.
let x = 0
let y = 0
let d = 1
//RIGHT, UP
while x * d < 1
print(x, y)
x = x + d
while y * d < 1
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, DOWN, DOWN
while x * d < 1
print(x, y)
x = x + d
while y * d < 1
print(x, y)
y = y + d
d = -1 * d
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x * d < 2
print(x, y)
x = x + d
while y * d < 2
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x * d < 2
print(x, y)
x = x + d
while y * d < 2
print(x, y)
y = y + d
Sekarang kita perhatikan bahwa x * d dan RHS adalah bilangan bulat sehingga kita dapat mengurangi nilai riil antara 0 dan 1 dari RHS tanpa memengaruhi hasil ketidaksetaraan. Kami memilih untuk mengurangi 0,5 dari ketidaksetaraan setiap pasangan sementara loop untuk membangun lebih banyak pola.
let x = 0
let y = 0
let d = 1
//RIGHT, UP
while x * d < 0.5
print(x, y)
x = x + d
while y * d < 0.5
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, DOWN, DOWN
while x * d < 1
print(x, y)
x = x + d
while y * d < 1
print(x, y)
y = y + d
d = -1 * d
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x * d < 1.5
print(x, y)
x = x + d
while y * d < 1.5
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x * d < 2
print(x, y)
x = x + d
while y * d < 2
print(x, y)
y = y + d
Kita sekarang dapat memperkenalkan variabel lain m untuk jumlah langkah yang kita ambil pada setiap pasangan while loop.
let x = 0
let y = 0
let d = 1
let m = 0.5
//RIGHT, UP
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 0.5
//LEFT, LEFT, DOWN, DOWN
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 0.5
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 0.5
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
Akhirnya, kita melihat bahwa struktur setiap pasangan while loop identik dan dapat direduksi menjadi satu loop yang ditempatkan di dalam loop lain. Juga, untuk menghindari penggunaan bilangan bernilai nyata, saya telah mengalikan nilai awal m; nilai m bertambah dengan; dan kedua sisi masing-masing ketidaksetaraan oleh 2.
Ini mengarah ke solusi yang ditunjukkan di awal jawaban ini.