কিভাবে পুনরাবৃত্তি সঙ্গে গল্ফ
পুনরাবৃত্তি, যদিও দ্রুততম বিকল্প নয়, খুব প্রায়ই সংক্ষিপ্ত হয়। সাধারণত, পুনরাবৃত্তি সবচেয়ে কম হয় যদি সমাধানটি চ্যালেঞ্জের একটি ছোট অংশের সমাধানে সহজতর করা যায়, বিশেষত যদি ইনপুটটি কোনও সংখ্যা বা স্ট্রিং থাকে। উদাহরণস্বরূপ, যদি f("abcd")
থেকে গণনা করা যায় "a"
এবং f("bcd")
, সাধারণত পুনরাবৃত্তি ব্যবহার করা ভাল।
উদাহরণস্বরূপ, ঘটনাচক্রে নিন:
n=>[...Array(n).keys()].reduce((x,y)=>x*++y,1)
n=>[...Array(n)].reduce((x,_,i)=>x*++i,1)
n=>[...Array(n)].reduce(x=>x*n--,1)
n=>{for(t=1;n;)t*=n--;return t}
n=>eval("for(t=1;n;)t*=n--")
f=n=>n?n*f(n-1):1
এই উদাহরণে, পুনরাবৃত্তি অবশ্যই অন্য যে কোনও বিকল্পের চেয়ে কম way
চারকোডগুলির যোগফল সম্পর্কে কীভাবে:
s=>[...s].map(x=>t+=x.charCodeAt(),t=0)|t
s=>[...s].reduce((t,x)=>t+x.charCodeAt())
s=>[for(x of(t=0,s))t+=x.charCodeAt()]|t // Firefox 30+ only
f=s=>s?s.charCodeAt()+f(s.slice(1)):0
এটি একটি কৌশলযুক্ত, তবে আমরা দেখতে পাচ্ছি যে সঠিকভাবে প্রয়োগ করা হলে পুনরাবৃত্তি 4 বাইট ওভার সাশ্রয় করে .map
।
এখন আসুন বিভিন্ন ধরণের পুনরাবৃত্তি দেখুন:
প্রি-পুনরাবৃত্তির
এটি সাধারণত সংক্ষিপ্ততম পুনরাবৃত্তি হয়। ইনপুট দুটি অংশ বিভক্ত করা a
এবং b
, এবং ফাংশন সঙ্গে কিছু হিসাব করে a
এবং f(b)
। আমাদের ফ্যাক্টরিয়াল উদাহরণটিতে ফিরে যাওয়া:
f=n=>n?n*f(n-1):1
এই ক্ষেত্রে, a
হয় এন , b
হয় এন -1 , এবং ফিরে মান a*f(b)
।
গুরুত্বপূর্ণ নোট: সমস্ত recursive ফাংশন আবশ্যক recursing থামাতে যখন ইনপুট যথেষ্ট ছোট একটি উপায় আছে। ফ্যাক্টরিয়াল ফাংশনে, এটি এর সাথে নিয়ন্ত্রণ করা হয় n? :1
, অর্থাত্ যদি ইনপুট 0 হয় , আবার কল না করে 1 ফিরে আসুন f
।
পোস্ট-পুনরাবৃত্তির
পুনরাবৃত্তি পূর্ব-পুনরাবৃত্তির অনুরূপ, তবে কিছুটা আলাদা। ইনপুট দুটি অংশ বিভক্ত করা a
এবং b
, এবং ফাংশন সঙ্গে কিছু হিসাব করে a
, তারপর কল f(b,a)
। দ্বিতীয় যুক্তির সাধারণত একটি ডিফল্ট মান থাকে (অর্থাত্ f(a,b=1)
)।
চূড়ান্ত ফলাফলের সাথে আপনাকে বিশেষ কিছু করার দরকার হলে প্রাক পুনরাবৃত্তি ভাল। উদাহরণস্বরূপ, আপনি যদি একটি সংখ্যার প্লাস 1 এর ফ্যাক্টরিয়াল চান:
f=(n,p=1)=>n?f(n-1,n*p):p+1
তারপরেও, তবে, পোস্টটি অন্য ফাংশনের মধ্যে প্রাক-পুনরাবৃত্তি ব্যবহারের চেয়ে সর্বদা সংক্ষিপ্ত নয়:
n=>(f=n=>n?n*f(n-1):1)(n)+1
তাহলে এটি কখন ছোট হবে? আপনি খেয়াল করতে পারেন যে এই উদাহরণে পুনঃ-পুনরাবৃত্তিটির জন্য ফাংশন আর্গুমেন্টগুলির চারপাশে প্রথম বন্ধনী প্রয়োজন, যখন প্রাক-পুনরাবৃত্তি হয়নি। সাধারণত, যদি উভয় সমাধানের জন্য আর্গুমেন্টের চারপাশে প্রথম বন্ধনী প্রয়োজন হয়, তবে পুনরাবৃত্তি 2 বাইটের চেয়ে কম হয়:
n=>!(g=([x,...a])=>a[0]?x-a.pop()+g(a):0)(n)
f=([x,...a],n=0)=>a[0]?f(a,x-a.pop()+n):!n
(প্রোগ্রামগুলি এই উত্তর থেকে নেওয়া )
সংক্ষিপ্ত সমাধানটি কীভাবে সন্ধান করবেন
সাধারণত সবচেয়ে সংক্ষিপ্ত পদ্ধতিটি সন্ধান করার একমাত্র উপায় হ'ল তাদের সকলের চেষ্টা করা। এটা অন্তর্ভুক্ত:
- loops
.map
(স্ট্রিংগুলির জন্য, হয় [...s].map
বা s.replace
সংখ্যার জন্য, আপনি একটি পরিসীমা তৈরি করতে পারেন )
- অ্যারে বোধগম্যতা
- প্রাক পুনরাবৃত্তি (কখনও কখনও এই বিকল্পগুলির মধ্যে অন্যটি)
- পোস্ট-পুনরাবৃত্তির
এবং এগুলি কেবল সর্বাধিক সাধারণ সমাধান; সবচেয়ে ভালো সমাধান এই সংমিশ্রণ, অথবা এমনকি হতে পারে কিছু সম্পূর্ণরূপে পৃথক । সংক্ষিপ্ততম সমাধানটি সন্ধান করার সর্বোত্তম উপায় হ'ল সবকিছু চেষ্টা করা ।