1 / 21

توابع و رویه های بازگشتی

توابع و رویه های بازگشتی. تهیه و تنظیم: فاطمه قاسمی دانشگاه صنعتی شریف – پاییز 86. مروری بر مطالب. تابع (رویه) می تواند توابع و رویه ای که قبل از آن و یا درون آن تعریف شده است را فراخوانی کند.

Download Presentation

توابع و رویه های بازگشتی

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. توابع و رویه های بازگشتی تهیه و تنظیم: فاطمه قاسمی دانشگاه صنعتی شریف – پاییز 86

  2. مروری بر مطالب • تابع (رویه) می تواند توابع و رویه ای که قبل از آن و یا درون آن تعریف شده است را فراخوانی کند. • تابع(رویه) می تواند خود را با پارامترهای جدید فراخوانی کند: • رویه های بازگشتی همانند حلقه های تکرار می باشند اما سرعت اجرایی آن ها کمتر است. چرا؟ • رویه های بازگشتی راه حل ساده ای برای بسیاری از مسائل هستند.

  3. اجزای رویه های بازگشتی • فرض کنید کامپیوتری داریم که فقط می تواند عمل جمع را انجام دهد. می خواهیم حاصلضرب 36 را بدست آوریم: • راه حل : • قدم 1: 26 را بدست می آوریم • قدم 2: عدد 6 را به حاصل قدم 1 اضافه می کنیم • راه حل : • قدم 1.1 :16 را بدست می آوریم • قدم 1.2 : عدد 6 را به حاصل قدم 1.1 اضافه می کنیم • قدم 2: عدد 6 را به حاصل قدم 1 اضافه می کنیم

  4. اجزای رویه های بازگشتی (ادامه) • به طور خلاصه می توانیم بنویسیم: Multiply(N,M) = M+Multiply(N-1,M); • تابع بازگشتی ضرب به صورت زیر تعریف می شود: Function Multiply(M, N: Integer):Integer; Begin if N=1 then Multiply:=M else Multiply:=M+Multiply(N,M-1); End;

  5. اجزای رویه های بازگشتی (ادامه) • در واقع مساله ، به دو مساله ساده تر شکسته می شود: • Multiply با پارامتر N-1 • جمع نتیجه با عدد M • اجزای رویه بازگشتی عبارتند از • شرط خاتمه عمل بازگشتی ؛ N=1 • گام بازگشتی : فراخوانی خود تابع درون تابع هنگامی که شرط خاتمه برقرار نباشد ؛ Multiply:=M+Multiply(N,M-1)

  6. ردیابی توابع بازگشتی • برای هر فراخوانی تابع بازگشتی را با یک فریم فعال نشان می دهیم که این فریم : • مقدار پارامترها و مقدار بازگشتی از هر فراخوانی را نشان می دهد.

  7. ردیابی توابع بازگشتی (ادامه) Multiply(6, 3) M is 6 N is 3 3 = 1 is false Multiply := 6 + Multiply (6,2) return 18 فراخوانی 1 M is 6 N is 2 2 = 1 is false Multiply := 6 + Multiply (6,1) return 12 فراخوانی 2 M is 6 N is 1 1 = 1 is true Multiply := 6 return 6

  8. خواص و راه حل های بازگشت پذیر • مسائلی که می توانند با بازگشت پذیری حل شوند مشخصات زیر را دارند : • یک یا چند حالت توقف، راه حلی ساده دارند که به صورت بازگشت پذیر نمی باشند. • حالت های دیگر مساله می توانند (با استفاده از بازگشت پذیری) به مسائلی تبدیل شوند که به حالت های توقف نزدیکترند. • وقتی مساله می تواند به سمت حالت های توقف کاهش داده شود که حل آن نسبتاً ساده تر شود.

  9. خواص و راه حل های بازگشت پذیر (ادامه) • گام های زیر را برای حل مساله بازگشتی دنبال کنید: • فهم مساله • تعیین حالت های توقف • تعیین گام های بازگشت پذیری • الگوریتم های بازگشت پذیر معمولا به شکل زیر هستند: If شرط_توقف then آن را حل کن else مساله را با استفاده از بازگشت پذیری به حالت های ساده تر تجزیه کن

  10. مثال : رویه ای که رشته دریافتی به طول N را معکوس چاپ می کند Procedure reverse(N : Integer); var next : char; begin if N=1 then begin read(next); write(next); end else begin read(next) reverse (N-1); write(next); end End;

  11. ردیابی رویه reverse با ورودی ‘abc’ Reverse (3) N is 3 Next is undefined 3 <= 1 is false Read ‘a’ into Next Reverse(2) Display ‘a’ return N is 2 Next is undefined 2 <= 1 is false Read ‘b’ into Next Reverse(1) Display ‘b’ return N is 1 Next is undefined 1 <= 1 is true Read ‘c’ into Next Display ‘c’ return

  12. مثال : رویه زیر با فراخوانی whatDo(4) خروجی چه خواهد بود؟ Procedure whatDo(I : Integer); Begin if I>1 then begin write(I:2); whatDo(I-1); write(I:2); end; end;

  13. توابع ریاضی برگشت پذیر • مثال : فاکتوریل عدد N!=N(N-1)! Fuction fact(N:Integer): Integer; Begin if n=1 fact:=1 else fact:=Nfact(N-1) End;

  14. توابع ریاضی برگشت پذیر (ادامه) • مثال : فاکتوریل عدد با استفاده از حلقه تکرار Function factIt(N: integer):Integer; Var I, factorial : Inetegr; Begin factorial := 1; for i:=2 to N do factorial := factorial*I; factIt:= factorial; End;

  15. توابع ریاضی برگشت پذیر (ادامه) • مثال : سری فیبوناچی برای 2 n : Fibn-2+Fibn-1=Fibn و در غیر اینصورت Fib1=1 و Fib2=1 • مثال : پیداکردن ب.م.م دو عدد صحیح مثبت N و M به صورت زیر تعریف می شود : • GCD(M,N) در صورتی که NM باشد و N، M را بشمارد، برابر N است. • GCD(M,N) در صورتی که M<N باشد مساوی GCD(N,M) است. • GCD(M,N) مساوی GCD(N, M mod N) است

  16. توابع ریاضی برگشت پذیر (ادامه) Function GCD(M,N : Integer) : Integer; Begin if (N<=M) and (M mod N=0) then GCD:=N else if M<N then GCD:=GCD(N,M) else GCD:=GCD(N, M mod N); End;

  17. رویه های بازگشتی با پارامترهای آرایه • مثال : پیدا کردن شاخص عنصر ورودی در آرایه Type IntArray : Array[1..max] of Inetger; Function search(var x:IntArray, Target, N: Integer): boolean; Begin if N=1 then search:=(x[1] = target) else if x[N]=target then search:=true else search:=search(x,target,N-1); End; • چون N پارامتر متغیری است، در صورت True بودن مقدار بازگشتی، شاخص عنصر target در آرایه را نشان می دهد.

  18. رویه های بازگشتی با پارامترهای آرایه (ادامه) • مثال : مقایسه دو آرایه با اندازه N Function equal(var x,y: IntArray, n: integer):boolean; Begin if N=1 then equal:=(x[1]=y[1]) else if x[N]<>y[N] than equal:= false else equal:=equal(x,y,n-1); End; • مقدار N در صورتی که تابع false بر گرداند، شاخص دو خانه نابرابر را نشان می دهد

  19. جستجوی دودویی • زمان اجرای رویه جستجو برای یک عنصر در آرایه ،حتی مرتب شده، برابر O(N) است. • مساله را با تکنیک شکست و حل برای آرایه مرتب شده صعودی مورد بررسی قرار می دهیم • اگر آرایه یک عضو دارد ، آیا targer برابر آن تک عضو است؟ • اگر آرایه چند عضو دارد؛ • عنصر را در نیمه پایینی آرایه پیدا کن اگر عنصر کوچکتر از عضو وسط باشد • عنصر را در نیمه بالایی آرایه پیدا کن اگر عنصر کوچکتر از عضو وسط باشد

  20. جستجوی دودویی (ادامه) Function binSearch(var f,l,target : Integer, x: IntArray):boolean; Begin if f=l then binSearch:=(x[f] =target) else Begin mid := (f+l) div 2; if target>x[mid] then binSearch(mid+1,l, target,x) else binSearch(f,mid,target,x); end end; • زمان اجرای این الگوریتم O(log2 N) است. چرا؟

  21. خطاهای متداول برنامه نویسی • اگر شرط خاتمه کامل یا صحیح نباشد، رویه ممکن است خود را بی نهایت بار فراخوانی کند ( تا زمانی که حافظه وجود داشته باشد)، در این صورت خطای زمان اجرای ”سر ریز پشته“ می دهد. • آرایه یا ساختمان داده های به کار رفته دیگری که بزرگ باشند به عنوان پارامترهای ارزشی می توانند به سرعت حافظه را پر کنند. به جز برای محافظت، آرایه ها را به صورت پارامتر متغیری تعریف کنید.

More Related