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
มีวิธีแก้ปัญหาที่เสนอมามากมายสำหรับปัญหานี้เขียนในภาษาการเขียนโปรแกรมต่าง ๆ อย่างไรก็ตามพวกเขาทั้งหมดดูเหมือนจะเกิดจากวิธีการที่ซับซ้อนเช่นเดียวกัน ฉันจะพิจารณาปัญหาทั่วไปเพิ่มเติมของการคำนวณเกลียวซึ่งสามารถแสดงออกอย่างกระชับโดยใช้การเหนี่ยวนำ
เคสฐาน: เริ่มต้นที่ (0, 0), เดินไปข้างหน้า 1 ตาราง, เลี้ยวซ้าย, เดินไปข้างหน้า 1 ตาราง, เลี้ยวซ้าย ขั้นตอนอุปนัย: เลื่อนไปข้างหน้า n + 1 สี่เหลี่ยมเลี้ยวซ้ายมุ่งหน้าไปข้างหน้า n + 1 สี่เหลี่ยมเลี้ยวซ้าย
ความสง่างามทางคณิตศาสตร์ของการแสดงปัญหานี้ขอแนะนำอย่างยิ่งว่าควรมีอัลกอริทึมที่ง่ายในการคำนวณวิธีแก้ปัญหา โดยคำนึงถึงสิ่งที่เป็นนามธรรมฉันได้เลือกที่จะไม่ใช้อัลกอริทึมในภาษาการเขียนโปรแกรมเฉพาะ แต่เป็นการใช้โค้ดหลอก
ก่อนอื่นฉันจะพิจารณาอัลกอริทึมเพื่อคำนวณวนซ้ำ 2 ครั้งโดยใช้ลูป 4 คู่ โครงสร้างของแต่ละคู่มีความคล้ายคลึงกัน แต่แตกต่างกันในสิทธิของตนเอง นี่อาจดูบ้าในตอนแรก (บางลูปถูกเรียกใช้ครั้งเดียวเท่านั้น) แต่ทีละขั้นตอนฉันจะทำการแปลงจนกว่าเราจะมาถึงที่ลูป 4 คู่ที่เหมือนกันและด้วยเหตุนี้สามารถแทนที่ด้วยคู่เดียวที่อยู่ภายในลูปอื่น สิ่งนี้จะช่วยให้เรามีวิธีแก้ปัญหาทั่วไปในการคำนวณซ้ำโดยไม่ใช้เงื่อนไขใด ๆ
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
การเปลี่ยนแปลงครั้งแรกที่เราจะทำคือการแนะนำตัวแปรใหม่ d สำหรับทิศทางที่เก็บค่า +1 หรือ -1 ทิศทางจะสลับหลังจากลูปแต่ละคู่ เนื่องจากเรารู้ค่าของ d ทุกจุดเราสามารถคูณแต่ละด้านของความไม่เท่าเทียมกันแต่ละข้างโดยปรับทิศทางของความไม่เท่าเทียมกันและทำให้การคูณของ d เป็นค่าคงที่เป็นค่าคงที่อื่น สิ่งนี้ทำให้เรามีดังต่อไปนี้
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
ตอนนี้เราทราบว่าทั้ง x * d และ RHS เป็นจำนวนเต็มดังนั้นเราสามารถลบค่าจริงใด ๆ ระหว่าง 0 และ 1 จาก RHS โดยไม่ส่งผลต่อผลลัพธ์ของความไม่เท่าเทียมกัน เราเลือกที่จะลบ 0.5 จากความไม่เท่าเทียมกันของคู่อื่น ๆ ในขณะที่ลูปเพื่อสร้างรูปแบบมากขึ้น
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
ตอนนี้เราสามารถแนะนำตัวแปรอีก m สำหรับจำนวนขั้นตอนที่เราทำในแต่ละคู่ของลูป
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
ในที่สุดเราจะเห็นว่าโครงสร้างของแต่ละคู่ของลูปในขณะที่ลูปเหมือนกันและสามารถลดเป็นลูปเดี่ยวที่อยู่ภายในลูปอื่น นอกจากนี้เพื่อหลีกเลี่ยงการใช้ตัวเลขมูลค่าจริงฉันได้คูณค่าเริ่มต้นของ m ค่า m ถูกเพิ่มค่าโดย; และทั้งสองด้านของความไม่เท่าเทียมกัน 2
สิ่งนี้นำไปสู่การแก้ปัญหาที่แสดงในตอนต้นของคำตอบนี้