रिकर्शन (Recursion) वह प्रक्रिया है जिसमें कोई फलन स्वयं को ही कॉल करता है। यह किसी बड़ी समस्या को छोटी, समान प्रकार की उप-समस्याओं में विभाजित करके हल करने की तकनीक है। रिकर्शन में फलन का प्रत्येक कॉल सिस्टम स्टैक में संग्रहीत होता है, और अंतिम कॉल से लौटने पर पिछले कॉल आगे बढ़ते हैं।
रिकर्सिव फलन के दो आवश्यक भाग होते हैं: 1. आधार स्थिति (Base Case): वह स्थिति जिस पर फलन स्वयं को कॉल करना बंद कर देता है। 2. रिकर्सिव स्थिति (Recursive Case): वह स्थिति जिसमें फलन स्वयं को कॉल करता है।
यदि आधार स्थिति नहीं होगी तो फलन अनंत बार कॉल होता रहेगा और स्टैक ओवरफ्लो (Stack Overflow) हो जाएगा।
def recursive_function(parameter):
if base_condition: # आधार स्थिति
return base_value
else:
# रिकर्सिव कॉल
return recursive_function(modified_parameter)
n का फैक्टोरियल: n! = n × (n-1) × (n-2) × ... × 1, जिसमें 0! = 1
def factorial(n):
if n == 0: # आधार स्थिति
return 1
else:
return n * factorial(n - 1) # रिकर्सिव कॉल
print(factorial(5)) # 120
factorial(4) = 4 * factorial(3)
= 4 * 3 * factorial(2)
= 4 * 3 * 2 * factorial(1)
= 4 * 3 * 2 * 1 * factorial(0)
= 4 * 3 * 2 * 1 * 1
= 24
फिबोनाची श्रृंखला में प्रत्येक पद पिछले दो पदों का योग होता है: 0, 1, 1, 2, 3, 5, 8, ...
def fibonacci(n):
if n <= 1: # आधार स्थिति
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
for i in range(7):
print(fibonacci(i), end=" ") # 0 1 1 2 3 5 8
def sum_natural(n):
if n == 1: # आधार स्थिति
return 1
else:
return n + sum_natural(n - 1)
print(sum_natural(5)) # 15
def power(base, exp):
if exp == 0: # आधार स्थिति
return 1
else:
return base * power(base, exp - 1)
print(power(2, 5)) # 32
def find_max(lst):
if len(lst) == 1: # आधार स्थिति
return lst[0]
else:
rest = find_max(lst[1:])
return lst[0] if lst[0] > rest else rest
print(find_max([4, 9, 2, 7])) # 9
रिकर्सिव फलन कॉल की प्रक्रिया स्टैक पर आधारित होती है:
def count_down(n):
if n == 0: # आधार स्थिति
print("समाप्त!")
else:
print(n)
count_down(n - 1) # रिकर्सिव कॉल
count_down(3)
# आउटपुट: 3, 2, 1, समाप्त!
| विशेषता | रिकर्शन | इटरेशन |
|---|---|---|
| परिभाषा | फलन स्वयं को कॉल करता है | लूप का उपयोग |
| कोड | छोटा, संक्षिप्त | अपेक्षाकृत लंबा |
| मेमोरी | स्टैक में प्रत्येक कॉल | केवल चर |
| गति | धीमी (कॉल ओवरहेड) | तेज़ |
| स्टैक ओवरफ्लो | संभव | नहीं |
| उपयोग | विभाजित-और-जीत समस्याएँ | सरल पुनरावृत्ति |
टावर ऑफ हनोई रिकर्शन की एक प्रसिद्ध समस्या है। इसमें तीन खूँटे (rods) होते हैं और पहले खूँटे पर आकार के अवरोही क्रम में रखी डिस्कें होती हैं। कार्य है सभी डिस्कों को नियमों के अनुसार तीसरे खूँटे पर ले जाना:
def tower_of_hanoi(n, source, helper, target):
if n == 1: # आधार स्थिति
print(source, "से", target, "ले जाएँ")
return
tower_of_hanoi(n - 1, source, target, helper)
print(source, "से", target, "ले जाएँ")
tower_of_hanoi(n - 1, helper, source, target)
tower_of_hanoi(3, 'A', 'B', 'C')
n डिस्कों के लिए आवश्यक चालों की संख्या 2^n - 1 होती है। अतः 3 डिस्कों के लिए 7 चालें, 4 के लिए 15 चालें। यह समस्या स्पष्ट रूप से दिखाती है कि रिकर्शन जटिल समस्याओं को छोटे, समान प्रकार के चरणों में कैसे विभाजित करता है।
सरल गिनती जैसी समस्याओं में लूप (इटरेशन) अधिक उपयुक्त होता है, जबकि ट्री ट्रैवर्सल जैसी समस्याओं में रिकर्शन स्वाभाविक है। परीक्षा में पूछे जाने पर रिकर्शन और इटरेशन की तुलना लाभ-सीमाओं के साथ लिखना चाहिए।
रिकर्सिव फलन लिखते समय निम्नलिखित चरणों का पालन करें:
उदाहरण के लिए, प्राकृतिक संख्याओं के योग में आधार स्थिति n == 1 है (योग 1), और रिकर्सिव संबंध sum(n) = n + sum(n-1) है। इसी प्रकार प्रत्येक रिकर्सिव समस्या को इन चार चरणों में हल किया जा सकता है। अभ्यास से रिकर्सिव सोच विकसित होती है जो कंप्यूटर विज्ञान के अनेक क्षेत्रों में उपयोगी है।
| फलन | आधार स्थिति | रिकर्सिव संबंध |
|---|---|---|
| फैक्टोरियल | n == 0 → 1 | n! = n × (n-1)! |
| फिबोनाची | n <= 1 → n | f(n) = f(n-1) + f(n-2) |
| प्राकृतिक योग | n == 1 → 1 | sum(n) = n + sum(n-1) |
| घातांक | exp == 0 → 1 | b^e = b × b^(e-1) |
| घटक | कार्य |
|---|---|
| आधार स्थिति | रिकर्शन रोकना |
| रिकर्सिव कॉल | स्वयं को बुलाना |
| पैरामीटर परिवर्तन | प्रत्येक कॉल में स्थिति बदलना |
| स्टैक | कॉल का प्रबंधन |
रिकर्शन एक शक्तिशाली तकनीक है जिसमें फलन स्वयं को कॉल करता है। आधार स्थिति रिकर्शन को रोकती है, जबकि रिकर्सिव कॉल समस्या को छोटे भागों में विभाजित करती है। फैक्टोरियल, फिबोनाची, प्राकृतिक योग और घातांक रिकर्शन के उत्कृष्ट उदाहरण हैं। रिकर्शन स्टैक पर आधारित होता है, इसलिए आधार स्थिति के बिना स्टैक ओवरफ्लो होता है। ट्री ट्रैवर्सल, बाइनरी सर्च और सॉर्टिंग एल्गोरिथ्मों में रिकर्शन का महत्वपूर्ण योगदान है। सरल समस्याओं में लूप अधिक कुशल होता है, परंतु कई जटिल समस्याओं के लिए रिकर्शन स्वाभाविक और संक्षिप्त हल प्रदान करता है।