21
1 ی ت ش گ از های ب ه ی ع و زو ب وا ت م ی ظ ن ت ه و ی ه ت: ی م س ا ه ق م ط ا ق ز ی- ی ا/ – ب ف ی ز ش ی ت ع ن ص گاه ش ن دا86

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

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: توابع و رویه های بازگشتی

1

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

:تهیه و تنظیم فاطمه قاسمی

دانشگاه صنعتی شریف – 86پاییز

Page 2: توابع و رویه های بازگشتی

2

مروری بر مطالب

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

تابع)رویه( می تواند خود را با پارامترهای جدیدفراخوانی کند:

رویه های بازگشتی همانند حلقه های تکرار می باشنداما سرعت اجرایی آن ها کمتر است. چرا؟

رویه های بازگشتی راه حل ساده ای برای بسیاری ازمسائل هستند.

Page 3: توابع و رویه های بازگشتی

3

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

فرض کنید کامپیوتری داریم که فقط می تواند عمل را 36جمع را انجام دهد. می خواهیم حاصلضرب

بدست آوریم:: راه حل

2: 1قدم6را بدست می آوریم اضافه می کنیم1 را به حاصل قدم 6: عدد 2قدم

: راه حل 1 :1.1قدم6را بدست می آوریم اضافه می کنیم1.1 را به حاصل قدم 6 : عدد 1.2قدم اضافه می کنیم1 را به حاصل قدم 6: عدد 2قدم

Page 4: توابع و رویه های بازگشتی

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;

Page 5: توابع و رویه های بازگشتی

5

اجزای رویه های بازگشتی )ادامه(

در واقع مساله ، به دو مساله ساده تر شکستهمی شود:

Multiply با پارامتر N-1 جمع نتیجه با عددM

اجزای رویه بازگشتی عبارتند از شرط خاتمه عمل بازگشتی ؛N=1 گام بازگشتی : فراخوانی خود تابع درون تابع هنگامی

که شرط خاتمه برقرار نباشد ؛ Multiply:=M+Multiply(N,M-1)

Page 6: توابع و رویه های بازگشتی

6

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

برای هر فراخوانی تابع بازگشتی را با یک فریمفعال نشان می دهیم که این فریم :

مقدار پارامترها و مقدار بازگشتی از هر فراخوانی رانشان می دهد.

Page 7: توابع و رویه های بازگشتی

7

ردیابی توابع بازگشتی )ادامه(

Multiply(6, 3)

M is 6

N is 3

3 = 1 is false

Multiply := 6 + Multiply (6,2)

return

M is 6

N is 2

2 = 1 is false

Multiply := 6 + Multiply (6,1)

return

M is 6

N is 1

1 = 1 is true

Multiply := 6

return

12

2فراخوانی

6

18

1فراخوانی

Page 8: توابع و رویه های بازگشتی

8

خواص و راه حل های بازگشت پذیر

مسائلی که می توانند با بازگشت پذیری حل شوندمشخصات زیر را دارند :

یک یا چند حالت توقف، راه حلی ساده دارند که بهصورت بازگشت پذیر نمی باشند.

حالت های دیگر مساله می توانند )با استفاده ازبازگشت پذیری( به مسائلی تبدیل شوند که به حالت

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

\ ساده تر شود. کاهش داده شود که حل آن نسبتا

Page 9: توابع و رویه های بازگشتی

9

خواص و راه حل های بازگشت پذیر )ادامه(

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

الگوریتم های بازگشت پذیر معموال به شکل زیرهستند:

If شرط_توقف then آن را حل کن

else مساله را با استفاده از بازگشت پذیری به حالت هایساده تر تجزیه کن

Page 10: توابع و رویه های بازگشتی

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); endEnd;

Page 11: توابع و رویه های بازگشتی

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

Page 12: توابع و رویه های بازگشتی

12

مثال : رویه زیر با فراخوانی whatDo(4)خروجی چه خواهد بود؟

Procedure whatDo(I : Integer);Begin if I>1 then begin

write(I:2);whatDo(I-1);

write(I:2); end; end;

Page 13: توابع و رویه های بازگشتی

13

توابع ریاضی برگشت پذیر

مثال : فاکتوریل عددN!=N(N-1)!Fuction fact(N:Integer): Integer;

Begin

if n=1 fact:=1

else fact:=Nfact(N-1)

End;

Page 14: توابع و رویه های بازگشتی

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;

Page 15: توابع و رویه های بازگشتی

15

توابع ریاضی برگشت پذیر )ادامه(

2مثال : سری فیبوناچی برای n : Fibn-2+Fibn-

1=Fibn و در غیر اینصورت Fib1=1 و Fib2=1

مثال : پیداکردن ب.م.م دو عدد صحیح مثبتN و M به صورت زیر تعریف می شود :

GCD(M,N) در صورتی که NM باشد و N، M را است.Nبشمارد، برابر

GCD(M,N) در صورتی که M<N باشد مساوی GCD(N,M) است.

GCD(M,N) مساوی GCD(N, M mod N)است

Page 16: توابع و رویه های بازگشتی

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;

Page 17: توابع و رویه های بازگشتی

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بازگشتی، شاخص عنصر

Page 18: توابع و رویه های بازگشتی

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 بر گرداند، شاخص دو

خانه نابرابر را نشان می دهد

Page 19: توابع و رویه های بازگشتی

19

جستجوی دودویی

زمان اجرای رویه جستجو برای یک عنصر در است.O(N)آرایه ،حتی مرتب شده، برابر

برای آرایه مرتب شکست و حلمساله را با تکنیک شده صعودی مورد بررسی قرار می دهیم

اگر آرایه یک عضو دارد ، آیاtarger برابر آن تک عضو است؟

اگر آرایه چند عضو دارد؛ عنصر را در نیمه پایینی آرایه پیدا کن اگر عنصر کوچکتر از عضو

وسط باشد عنصر را در نیمه باالیی آرایه پیدا کن اگر عنصر کوچکتر از عضو

وسط باشد

Page 20: توابع و رویه های بازگشتی

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)است. چرا؟

Page 21: توابع و رویه های بازگشتی

21

خطاهای متداول برنامه نویسی

اگر شرط خاتمه کامل یا صحیح نباشد، رویه ممکناست خود را بی نهایت بار فراخوانی کند ) تا زمانی

که حافظه وجود داشته باشد(، در این صورت خطای زمان اجرای ”سر ریز پشته“ می دهد.

آرایه یا ساختمان داده های به کار رفته دیگری کهبزرگ باشند به عنوان پارامترهای ارزشی می

توانند به سرعت حافظه را پر کنند. به جز برای محافظت، آرایه ها را به صورت پارامتر متغیری

تعریف کنید.