تابع بازگشتی

Collapse
X
 
  • زمان
  • نمایش
Clear All
new posts
  • shamsololama

    • 2010/02/15
    • 940

    تابع بازگشتی

    با درود فراوان

    در موضوع توضیاتی در مورد تابع بازگشتی و همچنین مثالهای بزنیم دوستانی که در این مورد اطلاعاتی دارند نیز اطلاعات خودشون را در اختیار دیگر دوستان قرار بدهند

    تابع باز گشتی بصورت کلی توابعی است که این تابع خودش را بصورت مستقیم یا غیر مستقیم فرار خوانی میکنند


    ---------------------------------------------------------------------------------------------------
    بمانیم تا کاری کنیم ،نه کاری کنیم تا بمانیم (دکتر شریعتی)
    shamsololama@yahoo.com
    09177733411
  • m_d6712

    • 2010/05/22
    • 174

    #2
    RE: تابع بازگشتی

    من تصمیم گرفتم بجای گذاشتن مثال یک سوال مطرح کنم. امیدوارم در ادامه دوستان مثال های زیاد از توابع بازگشتی در تالار بنویسند. اما این مطالب مطالبی است که از نظر من خیلی زیاد مهم بودند برای کسانی که قصد دارند از توابع بازگشتی استفاده نمایند.

    چه موقع از تابع بازگشتی استفاده نکنیم!؟

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

    مشکلی که توابع بازگشتی دارند، این هست که متغیر های local و مورد استفاده در تابع بعلاوه آدرس خود تابع در stack table ذخیره میشوند. در این صورت با فراخوانی هر بار تابع بازگشتی به صورت عمقی اطلاعاتی (نسبتا زیاد) در stack ذخیره شده و تا زمانی که تابع به انتها نرسیده و برنگردد در آنجا می ماند. فضای موجود برای ذخیره ی این انباشته اطلاعات محدود است و بنابراین عمق توابع بازگشتی نیز محدود است. ما نمی توانید توابع بازگشتی بنویسیم که عمق بالایی دارند. این مساله برای توابعی که میزان متغیر local بیشتری دارند؛ خیلی زیاد محسوس است. اما مثال زیر نشان دهنده این است که توابع بازگشتی با تعداد متغیر اندک نیز دارای مشکلاتی هستند. توالی فراخوانی توابع در Call Hierarchy نوشته می شود که درواقع نشاندهنده عمق برنامه است.

    مثال: این کد را ببینید
    Private Sub CommandButton1_Click()
    Dim sa As Integer
    sa = ab(1)
    End Sub


    Public Function ab(ByVal a As Integer)
    If a < 1000 Then
    a = ab(a + a)
    ab = a
    End If
    End Function

    کد بالا به صورت خیلی معمول انجام شده زیرا عمق تابع کم است.
    اما در صورتی که If a < 1000 Then را به If a < 100000 Then تغییر دهید. عمق تابع افزایش یافته و با stack overflow مواجه می شوید.

    برای این مشکل چه پشنهادی دارید؟ (البته من یک راه پیشنهادی برای حل این مشکل در آینده خواهم نوشت)

    مشکل دومی که به توابع بازگشتی وارد می شود. سرعت پایین این توابع است.
    تصور کنید تعداد زیادی متغیر لوکال دارید (چه در این تابع و چه در توابع دیگر)، در صورت استفاده از این نوع توابع، cpu در هر مرحله رفتن به عمق یا بازگشتن به سطح بالایی باید تمام متغیر های کنونی را در stack ذخیره کرده و متغیر های دیگری که قرار است مورد استفاده قرار گیرند و در stack هستند را بازگردانی نماید. این عمل زمانبر است و بهینه نیست.

    برای این مشکل هم راه حل هایی وجود دارد که من این قسمت رو باز میگذارم تا دوستان نظر بدهند.



    اما مزایای توابع بازگشتی:

    1- خیلی راحت و ساده قابل پیاده سازی است.
    2- در مواردی که نیاز به سرعت بالا و عمق زیاد نیست خیلی خوب عمل می کند.
    3- (فقط دوستانی که بهینه سازی کار می کنند) از این نوع توابع برای مبحث برنامه ریزی پویا استفاده وسیعی میشود. (فقط در صورتی که مشکلات بالا وجود نداشته باشد.)


    موفق و پیروز باشید.
    -------
    http://md6712.com
    جامعه ایده پردازان: http://idekadeh.com

    کامنت

    Working...