تابع بازگشتی در برنامه نویسی، نوعی روش حل مسئله است که در آن، یک تابع را درون خودش دوباره فراخوانی می کنیم تا زمانی که به یک شرط خاص برسد.
مثلاً برای محاسبه فاکتوریل یک عدد به روش تابع بازگشتی به شکل زیر عمل می کنیم:
همانطور که می دانید فاکتوریل یک عدد، یعنی ضرب آن عدد در اعداد کوچکتر از خود (تا عدد 1). یعنی فاکتوریل 6 برابر است با:
6! = 1×2×3×4×5×6
در نتیجه فاکتوریل هر عدد برابر است با حاصل ضرب آن عدد در فاکتوریل عدد قبلی:
6! = 5! × 6
5! = 4! × 5
4! = 3! × 4
3! = 2! × 3
2! = 1! × 2
1! = 1
این یعنی همان تابع بازگشتی. یعنی در هنگام محاسبه فاکتوریل یک عدد، فاکتوریل یک عدد دیگر را محاسبه کرده ایم:
کد این مسئله (با پایتون):
def factorial(n):
if n == 1:
return 1
return factorial(n-1) * n
print(factorial(6))
توجه داشته باشید که حتماً باید شرطی در کد داشته باشیم که در آنجا فراخوانی تابع را متوقف کنیم. در غیر اینصورت تابع تا ابد ادامه می یابد.
سلام خسته نباشید. یه سوال داشتم چرا 1 رو return میکنه؟
سلام. سلامت باشید.
ببینید می دونیم که فاکتوریل 1 برابر با 1 هست. پس اگر ورودی 1 باشه خروجی باید 1 برگردونده بشه.
توی توابع بازگشتی، از اونجایی که خود تابع return میشه، برای اینکه در یک جا این فراخوانی تابع متوقف بشه و بتونیم از تابع خارج بشیم باید در یک جا یک شرطی قرار بدیم که وقتی اون شرط برقرار میشه دیگه تابع فراخوانی نشه و به جاش یک مقدار ثابت برگردونده بشه.
در اینجا برای برگردوندن یک مقدار ثابت از کمترین مقدار توی فاکتوریل یعنی همون 1 استفاده کردیم. چون فاکتوریل هر عددی رو که بخوایم حساب کنیم از همون عدد شروع می کنیم و یکی یکی در فاکتوریل های عدد های کوچکتر ضرب می کنیم تا زمانی که به عدد 1 برسیم.
متشکرم از توضیحاتتون.
ولی اگر بخوام مثلا a به توان b رو بصورت بازگشتی محاسبه کنم به چه صورتی میشه ؟
برای a به توان b در واقع باید به تعداد b بار، a رو در خودش ضرب کنید. پس باید عدد b رو به عنوان تعداد بازگشت ها در نظر بگیرد و هر بار یکی از b کم کنید. و زمانی که b برابر با 1 شد یعنی یک a فقط باقی می مونه، که در نتیجه خود a رو برمیگردونید:
کد:
https://backendbaz.ir/online-editor/python/15092
سلام میشه a*b رو به صورت بازگشی با عدد مثال بزنید
سلام. اگر میخواهید a و b را به صورت بازگشتی در ورودی یک تابع بفرستید، اینجا یک مثال در پایتون داریم:
در این مثال، تابع `multiply_recursive` دو عدد `a` و `b` را به صورت بازگشتی ضرب میکند. این تابع ابتدا برای حالتهای پایه (هنگامی که b برابر با 0 باشد) مقدار 0 را برمیگرداند. سپس برای مقادیر مثبت b، عدد a را b بار با خودش جمع میکند. و برای مقادیر منفی b، عدد a را با -b ضرب کرده و نتیجه را منفی میکند. در نهایت، نتیجه ضرب به صورت بازگشتی محاسبه میشود و نمایش داده میشود.
الان این کد اشتباه برای a*b
int zarb(int a,int b)
}
if(b==1)
;return a
else{
;return a+zarb(a,b-1)
خیر. منطقاً درسته. برای ضرب دو عدد مثبت در هم.