ایجاد توابع بازگشتی در متلب

چاپ

در جهان، تکنیک های برنامه نویسی زیبایی وجود دارند، اما هیچ کدام از آنها به زیبایی توابع بازگشتی نیستند. مفهوم توابع بازگشتی ساده است. برای ایجاد یک تابع بازگشتی، یک تابع ایجاد می کنیم که تا زمانی که یک شرط برقرار باشد، خودش را فراخوانی می کند و سپس این تابع با استفاده از نتایج فراخوانی های قبلی، یک پاسخ را ایجاد می کند. به فرآیندی که یک تابع خودش را چندین بار فراخوانی کند، بازگشت گفته می شود. و به تابعی که آن را پیاده سازی می کند، تابع بازگشتی گفته می شود. 

 متداول ترین مثال برای توابع بازگشتی، محاسبه ی فاکتوریل !n است به طوری که n یک عدد صحیح مثبت باشد. محاسبه ی یک فاکتوریل به این معنی است که یک عدد را به صورت سلسله وار در اعداد کوچکتر از خود ضرب کنیم. بعنوان مثال !4 برابر است با 4*3*2*1 که برابر است با 24. 

در اکثر مثال هایی که نحوه ی ایجاد یک تابع بازگشتی را نشان می دهند، دقیقاً نحوه ی کارکرد این فرآیند نشان داده نمی شود. گام های زیر به شما کمک می کنند تا یک تابع بازگشتی را ایجاد کنید که چگونگی کارکرد فرآیند مورد نظر را نشان می دهد. بعداً در این فصل با یک کد واضح تر و مشابه با این کد مواجه خواهید شد. شما همچنین می توانید این تابع را در فایل Factorial1.m که در کدهای دانلودی قرار دارد، مشاهده نمایید. 

1. در تب Home از منوی متلب، بر روی علامت مثلثی شکل در زیر گزینه ی New کلیک کنید و از لیست باز شده گزینه ی Function را انتخاب نمایید.

خواهید دید که پنجره ی Editor باز می شود(به عکس 10.1 توجه کنید).

2. عبارت output_args را حذف کنید و به جای آن عبارت Result را بنویسید.

تابع ما یک پاسخ را به هریک از حلقه های قبلی فراخوانی برمی گرداند.

3. نام تابع را از Untitled به Factorial1 تغییر دهید.

نام تابع نخستین، باید با نام فایل ما تطابق داشته باشد.

4. عبارت input_args را با عبارت Value,Level جایگزین کنید. 

مقدار Value که دریافت می شود، همواره یک واحد کمتر از مقدار دریافتی در فراخوانی قبلی است. وظیفه ی آرگومان Level این است که نشان دهد مقدار Value در گذر زمان چه تغییراتی می کند.

5. کد نشان داده شده در عکس زیر را در تابع مورد نظر و بین کامنت ها و کلمه ی کلیدی end قرار دهید:

 در این مثال، از یک آرگومان اختیاری استفاده شده است. اولین باری که تابع مورد نظر فراخوانی می شود، Level هیچ مقداری ندارد بنابراین اپلیکیشن ما به طور اتوماتیک مقدار 1 را به آن انتساب می دهد.

 در کدهای ما، عملیات ضرب مقادیر به بخش هایی تقسیم می شود.  بعنوان مثال هنگامی که Value برابر با 4 باشد، کد ما نیاز دارد تا آن را در 3*2*1 ضرب کند. بخش 3*2*1 با فراخوانی دستور (Factorial1(Value - 1,Level + 1 ایجاد خواهد شد. در مرحله ی بعد از اجرای این دستور، Value برابر با 3 می شود. برای به دست آوردن نتیجه ی مناسب، کد ما باید این مقدار جدید (3) را در 2*1 ضرب کند. بنابراین تا زمانی که Value بزرگتر از 1 باشد، حلقه باید ادامه پیدا کند. 

یک تابع بازگشتی همواره باید دارای یک نقطه ی پایانی باشند. درواقع باید عبارت شرطی وجود داشته باشد که خودش را فراخوانی نکند. در این مورد، نقطه ی پایانی همان دستور else است. هنگامی که مقدار Value کمتر از 1 می شود، متغیر Result برابر با 1 شده و  بدون فراخوانی دوباره ی ()Factorial1 برگردانده می شود. اینجاست که حلقه ی فراخوانی خاتمه می یابد و جواب نهایی به دست می آید.

 توجه داشته باشید که در این مثال، از یک تابع جدید به نام ()fprintf برای نمایش دادن اطلاعات در صفحه ی نمایش استفاده شده است. تابع ()fprintf بعنوان اولین ورودی خود، یک سری مشخصات قالب بندی را دریافت می کند. در این مورد، تعیین می کند که رشته ی  = Value چاپ شود و به دنبال آن مقدار متغیر Value قرار گیرد سپس تعیین می کند که رشته ی = Level چاپ شود و به دنبال آن مقدار متغیر Level قرار گیرد. علامت d% در مشخصات قالب بندی به تابع ()fprintf می گوید که یک مقدار صحیح (عدد صحیح) را چاپ کند.  هنگامی که فرمت دهی خروجی پیچیده می شود، می توانید به جای تابع ()disp از تابع ()fprintf استفاده نمایید. توجه داشته باشید که تابع ()disp برای تبدیل مقادیر عددی به رشته به طوری که بتوانند چاپ شوند، از تابع ()num2str استفاده می کند. 

 

6. بر روی دکمه ی Save کلیک کنید.

خواهید دید که کادر محاوره ای Save As ظاهر می شود(به عکس 10.2 توجه کنید). دقت کنید که در فیلد File Name از این پنجره، نام صحیحی وارد شده باشد.

7. حالا در این پنجره بر روی Save کلیک کنید.

خواهید دید که فایل مورد نظر در دیسک ذخیره می شود.

8. در پنجره ی Command عبارت (Factorial1(4 را تایپ کنید و سپس کلید Enter را فشار دهید.

خروجی زیر را مشاهده خواهید نمود:

 خروجی بالا به شما نشان می دهد که بازگشت، چگونه کار می کند. توجه کنید که تمام خروجی های Value و Level در ابتدا ظاهر شده اند. این تابع تا زمانی که Value برابر با 1 شود، باید خودش را فراخوانی کند. هنگامی که Value برابر با 1 می شود، اولین Result(طبق عکس بالا) در خروجی ظاهر می شود. البته اکنون مقدار Result برابر با 1 است. اما در مراحل بعدی برابر با 1*2 و سپس برابر با 1*2*3 و در آخر برابر با 1*2*3*4 خواهد شد. 

 اکنون که اطلاعات بیشتری در مورد نحوه ی کارکرد توابع بازگشتی کسب کرده اید، به نسخه ی کوتاه شده ی آن در زیر توجه کنید. 

 

 این نسخه ی نهایی از تابع ما جمع و جور تر است اما اطلاعات کاربردی ای را در خروجی برای فهم بیشتر نمایش نمی دهد. اما این نسخه نسبت به نسخه ی قبلی سرعت اجرایی بیشتری دارد.