عمق‌بخشیدن به پیچیدگی توابع در Bash – بخش ۷ پرینت


## 🧠 عمق‌بخشیدن به پیچیدگی توابع در Bash – بخش ۷

مقاله به بررسی ویژگی‌های پیشرفته‌تر توابع در اسکریپت Bash پرداخته، مانند **متغیرهای محلی** و **بازگشت‌پذیری (recursive functions)**.

---

### 🔐 ۱. متغیرهای محلی در تابع

* با استفاده از `local` می‌توانید متغیری با حوزه (scope) محدود به داخل تابع تعریف کنید.
* مثال:

```bash
func() {
local i=10
j=20
echo "i داخل تابع = $i"
echo "j داخل تابع = $j"
}
func
echo "i بیرون تابع = $i" # خالی خواهد بود
echo "j بیرون تابع = $j" # مقدار 20 را نشان می‌دهد
```

شرح اینکه فقط `j` در خارج تابع قابل دسترسی است، ولی `i` محلی مانده و خارج نخواهد شد ([tecmint.com][1]).

---

### 🔁 ۲. بازگشت‌پذیری (Recursion)

#### 🔸 استفاده از local و بازگشتی بودن برای محاسبه فاکتوریل

نمونه تابع بازگشتی برای محاسبه `n!`:

```bash
fact() {
local num=$1
if [ $num -eq 0 ]; then
ret=1
else
local temp=$((num - 1))
fact $temp
ret=$((num * $?))
fi
return $ret
}

fact 5
echo "فاکتوریل ۵ = $?"
```

در اینجا `$?` مقدار بازگشتی فراخوانی بازگشتی قبلی را می‌گیرد .

⚠️ نکته: بازگشت بزرگتر از ۸ تاب ‌ممکن نیست (بخشی از محدودیت‌های سیستم‌عامل).

---

#### 🔸 بازگشت‌پذیری بدون local: دنباله فیبوناچی

یک تابع بازگشتی برای نمایش اعداد فیبوناچی بدون استفاده از متغیر local:

```bash
fib() {
a=$1
if [ $a -lt 2 ]; then
echo $a
else
((--a)); b=$(fib $a)
((--a)); c=$(fib $a)
echo $((b + c))
fi
}

for i in $(seq 0 15); do
out=$(fib $i)
echo $out
done
```

این روش بدون `local` عمل می‌کند؛ البته کمی **کند و منابع‌بر** خواهد بود .

---

### ✅ جمع‌بندی بخش VII

* ✅ یاد گرفتیم **چطور از متغیر محلی در توابع** برای جلوگیری از نشت داده استفاده کنیم.
* ✅ آموختیم **بازگشت‌پذیری** را در Bash تعریف کنیم (مثال: فاکتوریل و فیبوناچی).
* ⚠️ توجه کردیم که استفاده از بازگشتی بودن در Bash نواقصی دارد، از جمله محدودیت در بازگشت عددی و عملکرد ضعیف نسبت به زبان‌های کامپایلری.

 


آیا این پاسخ به شما کمک کرد؟

  • 0
« برگشت