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

Preview:

DESCRIPTION

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

Citation preview

1

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

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

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

2

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

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

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

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

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

3

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

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

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

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

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

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

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فراخوانی

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

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:=Nfact(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) در صورتی که NM باشد و 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

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

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

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

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

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

تعریف کنید.

Recommended