View
64
Download
5
Category
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