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 স্কোয়ারের দিকে এগিয়ে যান, বাম দিকে ঘুরুন।
এই সমস্যাটি প্রকাশের গাণিতিক কমনীয়তা দৃts়ভাবে পরামর্শ দেয় যে সমাধানটি গণনা করার জন্য একটি সাধারণ অ্যালগরিদম থাকা উচিত। বিমূর্ততা মাথায় রেখে, আমি একটি নির্দিষ্ট প্রোগ্রামিং ভাষায় অ্যালগরিদমটি প্রয়োগ না করে সিউডো কোড হিসাবে বেছে নিয়েছি।
প্রথমে আমি 4 জোড়া জোড় লুপ ব্যবহার করে সর্পিলটির মাত্র 2 পুনরাবৃত্তি গণনা করতে একটি অ্যালগরিদম বিবেচনা করব। প্রতিটি জোড়ের কাঠামোটি একই রকম, তবুও তার নিজস্বভাবে পৃথক। এটি প্রথমে ক্রেজি মনে হতে পারে (কিছু লুপগুলি কেবল একবার সম্পাদিত হয়ে যায়) তবে ধাপে ধাপে আমি রূপান্তরগুলি করব যতক্ষণ না আমরা 4 জোড়া লুপগুলি অভিন্ন এবং এটি অন্য লুপের ভিতরে রাখা একক জোড়া দিয়ে প্রতিস্থাপন করা যেতে পারে। এটি আমাদের কোনও শর্ত ছাড়াই গণনা n পুনরাবৃত্তিগুলির একটি সাধারণ সমাধান সরবরাহ করবে।
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
প্রথম রূপান্তরটি আমরা করব, দিকনির্দেশের জন্য একটি নতুন ভেরিয়েবল ডি এর পরিচিতি, যা মান +1 বা -1 রাখে। প্রতিটি জোড়া লুপের পরে দিকটি স্যুইচ করে। যেহেতু আমরা সমস্ত পয়েন্টে ডি এর মান জানি, তাই আমরা প্রতিটি বৈষম্যের প্রতিটি দিককে এর দ্বারা গুণিত করতে পারি, সেই অনুযায়ী অসমতার দিকটি সামঞ্জস্য করতে পারি এবং ডি এর কোনও গুণকে অন্য ধ্রুবকের সাথে ধ্রুবক করে তুলতে পারি। এটি আমাদের নীচের সাথে ছেড়ে দেয়।
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
এখন আমরা লক্ষ করি যে এক্স * ডি এবং আরএইচএস উভয়ই পূর্ণসংখ্যা তাই আমরা অসমতার ফলাফলকে প্রভাবিত না করে আরএইচএস থেকে 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
অবশেষে, আমরা দেখতে পাচ্ছি যে প্রতিটি লুপের সময় লুপের কাঠামোটি অভিন্ন এবং অন্য লুপের ভিতরে রাখা একক লুপে হ্রাস করা যায়। এছাড়াও, আসল মূল্যবান সংখ্যার ব্যবহার এড়াতে আমি এম এর প্রাথমিক মানটি বহুগুণ করেছি; মান মি দ্বারা বৃদ্ধি করা হয়; এবং প্রতিটি অসমতা উভয় পক্ষের দ্বারা 2 দ্বারা।
এটি এই উত্তরের শুরুতে দেখানো সমাধানের দিকে নিয়ে যায়।