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
Đã có nhiều giải pháp được đề xuất cho vấn đề này được viết bằng nhiều ngôn ngữ lập trình khác nhau, tuy nhiên tất cả chúng đều xuất phát từ cùng một cách tiếp cận phức tạp. Tôi sẽ xem xét vấn đề chung hơn của việc tính toán một vòng xoắn ốc có thể được thể hiện chính xác bằng cách sử dụng cảm ứng.
Trường hợp cơ sở: Bắt đầu tại (0, 0), di chuyển về phía trước 1 hình vuông, rẽ trái, di chuyển về phía trước 1 hình vuông, rẽ trái. Bước quy nạp: Di chuyển về phía trước n + 1 hình vuông, rẽ trái, di chuyển về phía trước n + 1 hình vuông, rẽ trái.
Sự tao nhã toán học của việc thể hiện vấn đề này mạnh mẽ cho thấy cần có một thuật toán đơn giản để tính toán giải pháp. Giữ sự trừu tượng trong tâm trí, tôi đã chọn không thực hiện thuật toán bằng ngôn ngữ lập trình cụ thể mà là mã giả.
Đầu tiên tôi sẽ xem xét một thuật toán để tính toán chỉ 2 lần lặp của vòng xoắn ốc bằng cách sử dụng 4 cặp vòng lặp while. Cấu trúc của mỗi cặp tương tự nhau, nhưng khác biệt theo đúng nghĩa của nó. Điều này thoạt nghe có vẻ điên rồ (một số vòng chỉ được thực hiện một lần) nhưng từng bước tôi sẽ thực hiện các phép biến đổi cho đến khi chúng ta đến 4 cặp vòng giống hệt nhau và do đó có thể được thay thế bằng một cặp duy nhất được đặt bên trong một vòng lặp khác. Điều này sẽ cung cấp cho chúng tôi một giải pháp chung về tính toán lặp đi lặp lại mà không sử dụng bất kỳ điều kiện nào.
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
Biến đổi đầu tiên chúng ta sẽ thực hiện là giới thiệu một biến mới d, theo hướng, giữ giá trị +1 hoặc -1. Hướng chuyển đổi sau mỗi cặp vòng. Vì chúng ta biết giá trị của d tại tất cả các điểm, chúng ta có thể nhân mỗi bên của mỗi bất đẳng thức với nó, điều chỉnh hướng của bất đẳng thức cho phù hợp và đơn giản hóa bất kỳ phép nhân nào của d với hằng số khác. Điều này để lại cho chúng tôi với những điều sau đây.
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
Bây giờ chúng tôi lưu ý rằng cả x * d và RHS đều là số nguyên để chúng tôi có thể trừ bất kỳ giá trị thực nào từ 0 đến 1 khỏi RHS mà không ảnh hưởng đến kết quả của bất đẳng thức. Chúng tôi chọn trừ 0,5 từ bất đẳng thức của mỗi cặp vòng lặp khác để thiết lập nhiều mẫu hơn.
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
Bây giờ chúng ta có thể giới thiệu một biến m khác cho số bước chúng ta thực hiện ở mỗi cặp vòng lặp while.
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
Cuối cùng, chúng ta thấy rằng cấu trúc của mỗi cặp vòng lặp giống hệt nhau và có thể được giảm xuống thành một vòng lặp được đặt bên trong một vòng lặp khác. Ngoài ra, để tránh sử dụng các số có giá trị thực, tôi đã nhân giá trị ban đầu của m; giá trị m được tăng lên theo; và cả hai mặt của mỗi bất đẳng thức bằng 2.
Điều này dẫn đến giải pháp hiển thị ở đầu câu trả lời này.