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 वर्ग आगे बढ़ें, बाएं मुड़ें। आगमनात्मक कदम: आगे बढ़ें एन + 1 वर्ग, बाएं मुड़ें, आगे बढ़ें एन + 1 वर्ग, बाएं मुड़ें।
इस समस्या को व्यक्त करने की गणितीय लालसा दृढ़ता से बताती है कि समाधान की गणना करने के लिए एक सरल एल्गोरिथ्म होना चाहिए। अमूर्तता को ध्यान में रखते हुए, मैंने एल्गोरिथ्म को एक विशिष्ट प्रोग्रामिंग भाषा में लागू करने के लिए नहीं बल्कि छद्म कोड के रूप में चुना है।
पहले मैं लूप्स के 4 जोड़े का उपयोग करते हुए सर्पिल के सिर्फ 2 पुनरावृत्तियों की गणना करने के लिए एक एल्गोरिथ्म पर विचार करूंगा। प्रत्येक जोड़ी की संरचना समान है, फिर भी अपने आप में अलग है। यह पहली बार में पागल लग सकता है (कुछ छोरों को केवल एक बार निष्पादित किया जाता है) लेकिन कदम से कदम मैं परिवर्तन कर दूंगा जब तक कि हम 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 पूर्णांक हैं, इसलिए हम असमानता के परिणाम को प्रभावित किए बिना, RHS से 0 और 1 के बीच किसी भी वास्तविक मूल्य को घटा सकते हैं। हम पैटर्न के अधिक स्थापित करने के लिए छोरों के हर दूसरे जोड़े की असमानताओं से 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
अब हम लूप्स के प्रत्येक जोड़े पर उठाए जाने वाले चरणों की संख्या के लिए एक और वैरिएबल एम पेश कर सकते हैं।
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 द्वारा वृद्धि की गई है; और 2 से प्रत्येक असमानता के दोनों पक्ष।
यह इस उत्तर की शुरुआत में दिखाए गए समाधान की ओर जाता है।