সাম্প্রতিককালে আমি অযৌক্তিক প্রতিবন্ধকতা সহ কিছু সিক্যুয়েন্স তৈরি করতে একটি ফাংশন লিখেছিলাম। সমস্যাটি প্রাকৃতিক পুনরাবৃত্তির সমাধান নিয়ে আসে। এখন এটি ঘটেছিল, এমনকি অপেক্ষাকৃত ছোট ইনপুটগুলির জন্যও, সিকোয়েন্সগুলি কয়েক হাজার thus
এখানে একটি উদাহরণ। মনে করুন আমরা একটি পুনরাবৃত্ত ফাংশন সহ স্ট্রিংয়ের সমস্ত ক্রিয়াকলাপ গণনা করতে চাই। নিম্নলিখিত নিষ্পাপ আলগোরিদম একটি অতিরিক্ত আর্গুমেন্ট 'স্টোরেজ' নেয় এবং যখনই এটি খুঁজে পায় এটিতে একটি অনুমতি যুক্ত করে:
def getPermutations(string, storage, prefix=""):
if len(string) == 1:
storage.append(prefix + string) # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], storage, prefix+string[i])
storage = []
getPermutations("abcd", storage)
for permutation in storage: print permutation
(দয়া করে অদক্ষতার বিষয়ে চিন্তা করবেন না এটি কেবল উদাহরণ example)
এখন আমি আমার ফাংশনটিকে একটি জেনারেটরে রূপান্তর করতে চাই, অর্থাৎ এটি স্টোরেজ তালিকায় যুক্ত করার পরিবর্তে কোনও ক্রমশক্তি অর্জন করতে:
def getPermutations(string, prefix=""):
if len(string) == 1:
yield prefix + string # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], prefix+string[i])
for permutation in getPermutations("abcd"):
print permutation
এই কোডটি কাজ করে না (ফাংশনটি খালি জেনারেটরের মতো আচরণ করে)।
আমি কিছু অনুপস্থিত করছি? উপরের পুনরাবৃত্তির অ্যালগরিদমকে পুনরায় না করে কোনও জেনারেটরে পরিবর্তন করার কোনও উপায় আছে কি ?
yield from getPermutations(string[:i] + string[i+1:])
, যা বিভিন্ন উপায়ে আরও দক্ষ!