← Back to Bash Course | Chapter 5: Functions | Lesson 9 of 11

Recursion क्या है

Recursion तब होता है जब एक function उसी problem के एक छोटे version को solve करने के लिए खुद को call करता है, आखिरकार एक simple base case पर stop होते हुए।
Syntax
bash
function_name() {
  local n=$1
  if (( n <= base_case )); then
    return_or_echo base_result
  else
    function_name $(( n - 1 ))
  fi
}

एक Simple Recursive Function: Factorial

एक recursive function को एक base case चाहिए जो recurse किए बिना सीधे return करे (यहां, n <= 1) और एक recursive case जो एक छोटे input के साथ खुद को call करे (यहां, n - 1), current step के साथ result combine करते हुए।

Base case के बिना, function बिना रुके खुद को call करता रहेगा।

उदाहरण: A Simple Recursive Function: Factorial

bash
#!/bin/bash
factorial() {
    local n=$1
    if (( n <= 1 )); then
        echo 1
        return
    fi
    local sub_result
    sub_result=$(factorial $(( n - 1 )))
    echo $(( n * sub_result ))
}
factorial 5

एक Range का Recursive Sum

यह recursive function 1 से n तक के numbers को, n से n - 1 तक sum करने के recursive result में जोड़ते हुए sum करता है, n के 0 पर पहुंचने पर stop होते हुए।

हर call local उपयोग करती है ताकि इसका अपना n और subtotal का copy call stack पर दूसरी calls में interfere न करे।

उदाहरण: Recursive Sum of a Range

bash
#!/bin/bash
sum_to() {
    local n=$1
    if (( n <= 0 )); then
        echo 0
        return
    fi
    local rest
    rest=$(sum_to $(( n - 1 )))
    echo $(( n + rest ))
}
result=$(sum_to 4)
echo "Sum from 1 to 4 is $result"

Recursion में local ज़्यादा मायने क्यों रखता है

एक recursive function में, हर active call के पास local variables का अपना independent set call stack पर होता है, जो essential है क्योंकि same function की कई calls simultaneously 'in flight' होती हैं।

local के बिना, वे सभी calls एक ही global variable share और stomp करती रहेंगी, गलत results produce करते हुए।

उदाहरण: Why local Matters More in Recursion

bash
#!/bin/bash
count_down() {
    local n=$1
    echo "At level: $n"
    if (( n > 0 )); then
        count_down $(( n - 1 ))
    fi
    echo "Back at level: $n"
}
count_down 3

Recursion Depth असल में Limited है

Bash tail calls को उस तरह optimize नहीं करता जैसे कुछ functional languages करती हैं, और हर recursive call stack space consume करती है, इसलिए बहुत deep recursion (हज़ारों levels) resource limits hit कर सकता है और fail हो सकता है।

किसी large, unbounded input size वाली चीज़ के लिए, Bash में एक iterative loop आमतौर पर safer और faster choice है।

Warning: Loops के लिए जो हज़ारों बार run हो सकते हैं, Bash में recursion से ज़्यादा एक iterative while/for loop पसंद करें।

उदाहरण: Recursion Depth Is Limited in Practice

bash
#!/bin/bash
countdown_safe() {
    local n=$1
    if (( n <= 0 )); then
        echo "Done"
        return
    fi
    countdown_safe $(( n - 1 ))
}
countdown_safe 10
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. एक base case (एक stopping condition) भूल जाना, जो function को तब तक खुद को हमेशा के लिए call करने का कारण बनता है जब तक Bash अपनी maximum function nesting depth hit न कर ले और error न दे।
  2. यह मान लेना कि recursive Bash functions deep recursion के लिए fast या efficient हैं; हर call में असली overhead जुड़ता है, और Bash recursion के लिए उस तरह optimized नहीं है जैसे कुछ languages हैं, इसलिए इसे shallow रखना सबसे अच्छा है।
  3. एक recursive function में function की अपनी working variables के लिए local उपयोग करना भूल जाना; इसके बिना, हर recursive call एक ही global variable को clobber करेगी बजाय हर call के पास अपना value होने के।
चैप्टर सारांश
  • हर recursive function को एक base case चाहिए जो recursion रोके, और एक recursive case जो एक smaller/simpler input के साथ खुद को call करे।
  • Bash एक maximum function nesting depth enforce करता है (FUNCNEST, default रूप से unlimited लेकिन व्यावहारिक रूप से system stack limits से bounded); runaway recursion आखिरकार हमेशा के लिए hang होने के बजाय error out होता है।
  • Recursive functions में Local variables खासतौर पर मायने रखते हैं क्योंकि हर call को working variables का अपना independent copy चाहिए।
  • Recursive functions आमतौर पर अपना result echo और command substitution के through return करते हैं, बिल्कुल किसी और data return करने वाले function की तरह।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.