कोडिंग साक्षात्कार की तैयारी · पाठ

पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि

पुनरावर्ती कॉल को वृक्षों में दर्शाइए, Master Theorem लागू कीजिए और merge sort, factorial तथा Fibonacci के रूपांतरों की समय-जटिलता निकालिए।

पाठ 3, कुल 4 में से13 चरण

पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि, CoddyKit पर कोडिंग साक्षात्कार की तैयारी का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह कोडिंग साक्षात्कार की तैयारी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

पुनरावृत्ति और कॉल स्टैक

जब कोई फ़ंक्शन स्वयं को कॉल करता है, तो हर कॉल एक स्टैक फ़्रेम जोड़ती है। ये फ़्रेम आधार स्थिति मिलने तक जमा होते रहते हैं और फिर एक-एक करके हटते हैं। इसकी कल्पना करना पुनरावृत्ति का विश्लेषण करने का पहला चरण है।

def factorial(n):
    if n == 0:       # base case
        return 1
    return n * factorial(n - 1)  # recursive call

# Call chain: factorial(4)
#   4 * factorial(3)
#     3 * factorial(2)
#       2 * factorial(1)
#         1 * factorial(0) -> 1
# Unwinds: 1, 2, 6, 24
print(factorial(5))  # 120

फिबोनाची का पुनरावृत्ति वृक्ष

एक पुनरावृत्ति वृक्ष हर कॉल को उसकी उप-कॉल में फैलाता है। सरल Fibonacci हर बार दो भागों में बँटता है, जिससे लगभग 2^n नोड वाला वृक्ष बनता है — यानी O(2^n)। कोड देखें।

call_count = [0]

def fib_naive(n):
    call_count[0] += 1
    if n <= 1:
        return n
    return fib_naive(n-1) + fib_naive(n-2)

for n in [5, 10, 15, 20]:
    call_count[0] = 0
    result = fib_naive(n)
    print(f'fib({n})={result}, calls={call_count[0]}')
# Calls roughly double each time n increases by 1

दोहराई जाने वाली उप-समस्याओं को पहचानना

उस वृक्ष में fib(3) जैसी वही कॉल अलग-अलग शाखाओं में दोहराई जाती हैं। ये एक-दूसरे पर निर्भर उप-समस्याएँ संस्मरणन के संकेत हैं, जो O(2^n) को घटाकर O(n) कर देता है।

# Memoised: each unique sub-problem computed once
def fib_memo(n, memo={}):
    if n in memo: return memo[n]
    if n <= 1:    return n
    memo[n] = fib_memo(n-1, memo) + fib_memo(n-2, memo)
    return memo[n]

call_count2 = [0]
def fib_counted(n, memo={}):
    call_count2[0] += 1
    if n in memo: return memo[n]
    if n <= 1:    return n
    memo[n] = fib_counted(n-1, memo) + fib_counted(n-2, memo)
    return memo[n]

fib_counted(20)
print(f'calls with memo: {call_count2[0]}')  # only 21

मर्ज सॉर्ट का पुनरावृत्ति वृक्ष

मर्ज सॉर्ट के वृक्ष में log n स्तर होते हैं और हर स्तर पर कुल O(n) काम होता है — हर तत्व को एक बार छुआ जाता है। दोनों को गुणा करने पर O(n log n) मिलता है। कोड देखें।

# Merge sort: at each level, n total elements are merged
# Level 0:  1 merge of n elements    -> n work
# Level 1:  2 merges of n/2 each     -> n work
# Level 2:  4 merges of n/4 each     -> n work
# ...log(n) levels...
# Total: n * log(n)

# Verify with operation counter:
def merge_sort_counted(arr):
    ops = [0]
    def _sort(a):
        if len(a) <= 1: return a
        m = len(a) // 2
        l, r = _sort(a[:m]), _sort(a[m:])
        result, i, j = [], 0, 0
        while i < len(l) and j < len(r):
            ops[0] += 1
            if l[i] <= r[j]: result.append(l[i]); i+=1
            else:             result.append(r[j]); j+=1
        return result + l[i:] + r[j:]
    return _sort(arr), ops[0]

_, c = merge_sort_counted(list(range(64, 0, -1)))
print(f'Merge ops: {c}')  # ~384 ~ 64*log2(64)=384

मास्टर प्रमेय

मास्टर प्रमेय T(n) = a*T(n/b) + O(n^d) को तीन स्थितियों से हल करता है। मर्ज सॉर्ट के लिए (a=2, b=2, d=1) यह O(n log n) देता है। परीक्षा के लिए तीनों स्थितियाँ याद कर लीजिए।

# Merge sort: T(n) = 2*T(n/2) + O(n)
# a=2, b=2, d=1, log_b(a)=log2(2)=1=d  => O(n log n)

# Binary search: T(n) = 1*T(n/2) + O(1)
# a=1, b=2, d=0, log2(1)=0=d  => O(log n)

# Strassen matrix mult: T(n) = 7*T(n/2) + O(n^2)
# a=7, b=2, d=2, log2(7)~2.81 > 2 => O(n^log2(7)) ~ O(n^2.81)

import math
print('log2(7) =', math.log2(7))  # 2.807...

पुनरावृत्ति वृक्ष बनाना: चरण-दर-चरण

पुनरावृत्ति वृक्ष बनाने के लिए: सबसे ऊपर T(n) लिखिए, हर कॉल को फैलाइए, हर स्तर पर होने वाले काम का योग निकालिए, फिर उसे स्तरों की संख्या से गुणा कीजिए। तब तक अभ्यास कीजिए, जब तक यह अपने-आप होने न लगे।

# Factorial: T(n) = T(n-1) + O(1)
# Tree is a chain: n levels, O(1) each -> O(n)

# Fibonacci: T(n) = T(n-1) + T(n-2) + O(1)
# Binary tree of depth n, ~2^n nodes -> O(2^n)

# Merge sort: T(n) = 2*T(n/2) + O(n)
# Log levels, n work each -> O(n log n)

def count_recursive_calls(n, results=[]):
    if n <= 1:
        results.append(n)
        return n
    return count_recursive_calls(n-1, results) + count_recursive_calls(n-2, results)

results = []
count_recursive_calls(8, results)
print(f'fib(8) leaf calls: {len(results)}')

घातीय पुनरावृत्ति: उपसमुच्चय

सभी उपसमुच्चय बनाना O(2^n) है — ऐसे ठीक 2^n उपसमुच्चय होते हैं, इसलिए इससे बेहतर नहीं किया जा सकता। हर तत्व या तो शामिल होता है या नहीं, जिससे विकल्पों का एक द्विआधारी वृक्ष बनता है। कोड देखें।

def subsets(nums):
    result = []
    def backtrack(start, current):
        result.append(list(current))  # O(n) copy
        for i in range(start, len(nums)):
            current.append(nums[i])
            backtrack(i + 1, current)
            current.pop()
    backtrack(0, [])
    return result

nums = [1, 2, 3]
ss = subsets(nums)
print(len(ss))  # 8 = 2^3
print(ss)

टेल पुनरावृत्ति और अनुकूलन

टेल पुनरावृत्ति तब होती है, जब पुनरावर्ती कॉल बिल्कुल अंतिम चरण हो। कुछ भाषाएँ इसके लिए फ़्रेम का पुनः उपयोग करती हैं, लेकिन Python नहीं करता — इसलिए गहरी पुनरावृत्तियाँ फिर भी ओवरफ़्लो कर जाती हैं। इसके बजाय लूप का उपयोग करें।

# Tail-recursive factorial (accumulator pattern)
def fact_tail(n, acc=1):
    if n == 0:
        return acc
    return fact_tail(n - 1, n * acc)  # tail call

# Python does NOT TCO, so this overflows for large n
# Instead, convert to iterative:
def fact_iter(n):
    acc = 1
    while n > 0:
        acc *= n
        n -= 1
    return acc

print(fact_tail(10))  # 3628800
print(fact_iter(10))  # 3628800

पुनरावृत्ति की स्थान-जटिलता

हर पुनरावर्ती कॉल एक फ़्रेम रखती है, इसलिए पुनरावृत्ति में O(depth) स्थान लगता है। रैखिक पुनरावृत्ति O(n) है; संतुलित वृक्ष पर DFS O(log n) है। बहुत गहराई तक जाने पर RecursionError मिलता है।

import sys
print(sys.getrecursionlimit())  # default 1000

# Increase limit for deep problems
sys.setrecursionlimit(10000)

# Track max depth manually
def max_depth_tracker(n, depth=0, max_seen=[0]):
    max_seen[0] = max(max_seen[0], depth)
    if n <= 0:
        return
    max_depth_tracker(n - 1, depth + 1, max_seen)
    return max_seen[0]

print(max_depth_tracker(50))  # 50  => O(n) stack frames

क्विक सॉर्ट का पुनरावृत्ति वृक्ष

क्विक सॉर्ट अच्छे पिवट के साथ O(n log n) होता है, लेकिन सॉर्ट किए हुए input पर खराब पिवट इसकी जटिलता को O(n^2) तक बढ़ा देता है। इसी कारण पिवट को यादृच्छिक बनाना महत्वपूर्ण है। कोड देखें।

import random

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = random.choice(arr)  # randomised -> O(n log n) expected
    less    = [x for x in arr if x < pivot]
    equal   = [x for x in arr if x == pivot]
    greater = [x for x in arr if x > pivot]
    return quick_sort(less) + equal + quick_sort(greater)

print(quick_sort([3, 6, 8, 10, 1, 2, 1]))  # sorted

पावर फ़ंक्शन: log n पुनरावृत्ति

सरल x^n में O(n) गुणा लगते हैं, लेकिन वर्ग करने से हर चरण में काम आधा हो जाता है: x^n = (x^(n/2))^2। इससे स्पष्ट O(log n) मिलता है — आधा होने की प्रक्रिया का अच्छा उदाहरण। कोड देखें।

def fast_pow(x, n):
    if n == 0: return 1
    if n < 0:  return 1 / fast_pow(x, -n)
    if n % 2 == 0:
        half = fast_pow(x, n // 2)
        return half * half          # O(log n) calls
    return x * fast_pow(x, n - 1)

print(fast_pow(2, 10))   # 1024
print(fast_pow(3, 5))    # 243
# Only log2(10)=3-4 recursive calls for n=10

त्वरित जाँच

त्वरित जाँच — देखिए कि पुनरावृत्ति-वृक्ष विधि ने आपको क्या सिखाया। एक प्रश्न है, समय लेकर कीजिए। 🌳

पाठ का पुनरावलोकन

पुनरावलोकन: एक पुनरावृत्ति वृक्ष कुल काम दिखाता है, मास्टर प्रमेय विभाजित-करो-और-विजित-करो वाली पुनरावृत्ति को हल करता है, और पुनरावृत्ति में O(depth) स्टैक स्थान लगता है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ कोडिंग साक्षात्कार की तैयारी सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
90
पाठ
360

अक्सर पूछे जाने वाले प्रश्न

क्या “पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि” पाठ निःशुल्क है?

हाँ—“पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। कोडिंग साक्षात्कार की तैयारी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि” में मैं क्या सीखूँगा?

पुनरावर्ती कॉल को वृक्षों में दर्शाइए, Master Theorem लागू कीजिए और merge sort, factorial तथा Fibonacci के रूपांतरों की समय-जटिलता निकालिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ कोडिंग साक्षात्कार की तैयारी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या कोडिंग साक्षात्कार की तैयारी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर कोडिंग साक्षात्कार की तैयारी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस कोडिंग साक्षात्कार की तैयारी पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर कोडिंग साक्षात्कार की तैयारी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. शुरुआत से Big-O संकेतन
  2. लूप और नेस्टेड लूप का विश्लेषण
  3. पुनरावृत्ति और पुनरावृत्ति-वृक्ष विधि
  4. स्थान-जटिलता और संतुलन
← कोडिंग साक्षात्कार की तैयारी पर वापस जाएँ