Recursion क्या है
In this page:
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
#!/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
Login to try C/C++/Java/PHP code in the editor
एक 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
#!/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"
Login to try C/C++/Java/PHP code in the editor
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
#!/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
Login to try C/C++/Java/PHP code in the editor
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 है।
while/for loop पसंद करें।उदाहरण: Recursion Depth Is Limited in Practice
#!/bin/bash
countdown_safe() {
local n=$1
if (( n <= 0 )); then
echo "Done"
return
fi
countdown_safe $(( n - 1 ))
}
countdown_safe 10
Login to try C/C++/Java/PHP code in the editor
- एक base case (एक stopping condition) भूल जाना, जो function को तब तक खुद को हमेशा के लिए call करने का कारण बनता है जब तक Bash अपनी maximum function nesting depth hit न कर ले और error न दे।
- यह मान लेना कि recursive Bash functions deep recursion के लिए fast या efficient हैं; हर call में असली overhead जुड़ता है, और Bash recursion के लिए उस तरह optimized नहीं है जैसे कुछ languages हैं, इसलिए इसे shallow रखना सबसे अच्छा है।
- एक 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 की तरह।
Chapter Quiz — Complete all 11 topics to unlock
0/11 topics done
Complete these topics first: