استاد ما هنوز تابع بازگشتی رو نگفته من خودم از کتاب جعفر نژاد قمی خوندم. خیلی سخته هر کاری می کنم نمی تونم بفهمم می تونی برام توضیح بدی؟ تو خودت چه جوری فهمیدی؟
استاد گفته بود که این تمرین اختیاریه و هر کی بیاره 1 نمره می گیره.
معمولا وقتی بخواهیم یه عمل تکراری رو چندین بار انجام بدیم میتونیم از توابع بازگشتی استفاده کنیم و توی تابع, خود تابع رو صدا بزنیم و با استفاده از چک کردن آرگومان ها این حلقه تا یه جایی ادامه پیدا کنه.
فکر کنم یه مثال ساده در مورد توابع بازگشتی تابع فاکتوریل بشه (گرچه نوشتن فاکتوریل به صورت بازگشتی از لحاظ سرعت اجرا جالب نیست اما مثال خوبیه)
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ما میخواهیم تابعی بنویسیم که این !5 رو حساب کنه.توی محاسبه ی این ضرب, ما عدد 1 رو داریم که در عدد بعدیش یعنی 2 ضرب میشه.نتیجه در عدد بعدی یعنی 3 ضرب میشه.بعدی در 4 و الی آخر.یعنی یه عمل تکراری باید انجام بشه.و البته برعکس هم میشه بهش نگاه کرد.ما عدد 5 رو داریم که باید در عدد کمتر از خودش یعنی 4ضرب بشه.نتیجه باید در عدد کمتر یعنی 3 ضرب بشه تا اینکه به 1 برسیم و وقتی به یک رسیدیم دیگه کار تمومه.
تابع رو برای حالت دوم مینویسیم.
تابع(fact) فقط یک عدد(n) میگیره و فاکتوریلش رو برمیگردونه, به این صورت که اگه عدد یک بود, 1 رو برمیگردونه و در غیر این صورت, مقدار(n * fact(n-1 رو که برابر همون !n هست رو برمیگردونه.وقتی توی خود تابع, (fact(n-1 فراخوانی میشه, مسیر برنامه به اول تابع میره (مثل وقتی که توی یک تابع, یک تابع دیگه رو صدا بزنی) و n-1 رو به تابع میده.دوباره اینجا اگه n دو باشه n-1 میشه 1 و تابع 1 رو برای تابع فراخواننده(که همین تابع هست) برمیگردونه در نتیجه در تابع اول, (fact(n-1 رو برمیگردونه. اگه n بیشتر از 2 باشه دوباره توی تابع دوم تابع fact برای بار دوم صدا زده میشه (fact(n-1 -1 و مقدار در n-1 ضرب میشه و برای تابع اول فرستاده میشه.
این حلقه ی تو در تو تا جایی که n ی که برای تابع فرستاده میشه 1 نباشه ادامه پیدا میکنه و نتیجه ای که توی اولین تابع بدست میاد میشه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
میدونم شاید درست توضیح ندادم روی شکل خیلی راحتر میشه توضیح داد.اگه از یه IDE مثل Visual Studio که Debug قوی داشته باشه استفاده میکنی, با Trace کردن خط به خط این تابع خیلی راحتتر متوجه میشی که منظور چیه :
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید