30
هان داده ساختماfaradars.org/fvds9402 مدرس: فرشید شیرافکن دانشجوی دکتری تهران نشگاه دا( سی ارشد کارشنا کارشناسی و: م افزار کامپیوتر نر( ) دکتری: نفورماتیک بیو ا) هان داده ساختما( بع بازگشتی توا) 1 ﻓﺮادرسFaraDars.org

آموزش ساختمان داده ها - بخش دوم

Embed Size (px)

Citation preview

Page 1: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

:مدرسفرشید شیرافکن

دانشگاه تهران دانشجوی دکتری (بیو انفورماتیک: دکتری( )کامپیوتر نرم افزار: کارشناسی و کارشناسی ارشد )

ساختمان داده ها(توابع بازگشتی)

1

فرادرس

FaraDars.org

Page 2: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تعریف

2

:(recursive)بازگشتیتابعوودمی‌شاجرامحدوديمراحلتعدادبهتابعاين.بزندصداراتابعخودکهباشددستوريکحداقلحاويکهاستتابعی.می‌شودمتوقفآنازپس:بازگشتیتوابعازهايیمثالفاکتوريل-1nتا1اعدادمجموع-2توان-3ترکیب-4صحیحتقسیمقسمتخارج-5آکرمان-6هانوي-7فیبوناچی-8هاخرگوشولدوزاد-9

فرادرس

FaraDars.org

Page 3: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تابع فاکتوریل

3

:کندمیمحاسبهراnفاکتوریلزیرتابعf( n ){

if (n==1)

return 1;

else

return n * f(n-1);

}:‌4فراخوانی‌تابع‌با‌مقدار‌:‌مثال

f(4)=4*f(3)=4*6=24

f(3)=3*f(2)=3*2=6

f(2)=2*f(1)=2*1=2

1)1(

11)(

nnfn

nnfفرادرس

FaraDars.org

Page 4: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

nتا 1مجموع اعداد

4

:را محاسبه می کندnتا 1تابع زیر مجموع اعداد

sum( n )

{

if (n==1)

return 1;

else

return n+ sum(n-1) ;

}

:‌‌است6برابر‌n=3ازاي‌به‌خروجی‌فراخوانی‌تابع‌

sum(3)=3+sum(2) =3+3=6

sum(2)=2+sum(1) =2+1=3

1)1(

11)(

nnsumn

nnsumفرادرس

FaraDars.org

Page 5: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تابع توان

5

(هستندمثبتوصحیحهاورودي):کندمیمحاسبهرامقدارزيرتابع

f (n , m){

if (m==1)

return n;

else

return n * f(n,m-1);

}

:فراخوانی‌می‌کنیم f(3,4)به‌طور‌نمونه‌تابع‌را‌به‌صورتf(3,4) = 3 * f(3,3) =3*3*3*3

f(3,3) = 3 * f(3,2) =3*3*3

f(3,2) = 3 * f(3,1) =3*3

1)1,(

1),(

mmnfn

mnmnf

mn

فرادرس

FaraDars.org

Page 6: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تابع ترکیب

6

:کندمیمحاسبهراnازmترکیبfتابعf ( n , m )

{

if ( (n==m) || (m==0) )

return 1;

else

return f(n-1 , m) + f(n-1 , m-1);

}

:‌f(4,2)فراخوانی‌f (4,2) = f (3,2) + f (3,1) =3+3=6

f (3,2) = f (2,2) + f (2,1) =1+2=3

f (3,1) = f (2,1) + f (2,0) =2+1=3

f (2,1) = f (1,1) + f (1,0) =1+1=2

فرادرس

FaraDars.org

Page 7: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

divتابع (محاسبه خارج قسمت تقسیم صحیح)

7

:bبرaصحیحتقسیمقسمتخارجمحاسبه

:f(11,3)فراخوانی

f (11,3) = f (8,3) + 1 = 2+1=3

f (8,3) = f (5,3) + 1 = 1+1=2

f (5,3) = f (2,3) + 1 = 0+1=1

.کنیدسازيپیادهراmodتابع،ايندرتغییريبا:تمرين

babbaf

babaf

1),(

0),( فرادرس

FaraDars.org

Page 8: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تابع آکرمان

8

:استمعروفآکرماننامبهزيرتابع

:f(1,1)فراخوانیf ( 1 , 1 )

= f ( 0 , f ( 1 ,0 ) )

= f ( 0 , f ( 0 , 1 ) )

= f ( 0 , 2 )

=3

0,0))1,(,1(

0)1,1(

01

),(

babafaf

baf

ab

baf فرادرس

FaraDars.org

Page 9: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

روابطی در تابع آکرمان

9

:استبرقرارزیرروابطآکرمانتابعدر

:نمونهطوربه 32),4(

32),3(

3)3(2),2(

3)3(2),1(

3

2

3

2...

n

n

nf

nf

nnf

nnf

173)37(2)7,2( f

102132)7,3( )37( f 32)1,4(222 f

93)37(2)7,1( f

فرادرس

FaraDars.org

Page 10: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

برج هانوی

10

میلهازکاراينبرايکهاستCمیلهبهمهرهnانتقالهدف.داردقرارAمیلهرويبرمهرهnکهدارد،وجودA,B,CمیلهسهBشودمیگرفتهکمک.

.يابدمیکاهشباالبهپايینازAمیلهدرهامهرهاندازهازکهردداوجودمهرهيکانتقالامکانفقطبارهردر.بگیردقرارنبايدکوچکترمهرهرويبربزرگترمهرههرگزهامهرهانتقالدر

فرادرس.شودمیانتخابمیلهباالي

FaraDars.org

Page 11: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

(ادامه)برج هانوی

11

:کنیممیحلزيرصورتبهرامسئله،مهرهيکازبیشوجودصورتدر

.BمیلهبهAمیلهازمهرهn-1انتقال(1

.CمیلهبهAمیلهازامnمهرهانتقال(2 فرادرس.CمیلهبهBمیلهازمهرهn-1انتقال(3

FaraDars.org

Page 12: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

(ادامه)برج هانوی

12

BکمکبهCبهAازمهرهnانتقالالگوریتم

tower (n , A, B, C)

{

if (n ==1 )

A to C;

else {

tower ( n–1 , A, C, B);

A to C;

tower ( n–1 , B, A, C);

}

}

فرادرس

FaraDars.org

Page 13: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

(مثال)برج هانوی

13

B:T(3,A,B,C)میلهکمکبهCمیلهبهAمیلهازمهره3انتقال

)7(),,,1(

)6(

)5(),,,1(

),,,2(

)4(

)3(),,,1(

)2(

)1(),,,1(

),,,2(

CACBAT

CB

ABACBT

CABT

CA

BCBACT

BA

CACBAT

BCAT فرادرس

FaraDars.org

Page 14: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تمرین

14

رويبرترکوچکمهره.دارندقرارAمیلهدرترتیببهمهرهnابتدادرکهبگیريدنظردرCوA،Bمیلهسهباراهانويبرجمسئله.داردقرارتربزرگمهره

ازراستيکراايمهرههیچتواننمیکهشرطاينباببريمBمیلهبهراهامهرههمهمسئله،اينمقرراترعايتباخواهیممی.بردAبهBازياBبهAمیله

.بنويسیدرامسئلهاينبرايبازگشتیرابطهباشد،مسئلهاينبرايهامهرهحرکتتعدادکمینهT(n)اگر فرادرس

FaraDars.org

Page 15: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تابع فیبوناچی

15

(…,0,1,1,2,3,5,8,13,21,34):فیبوناچیسریامnجملهمحاسبه

f(n){

if ((n==0) || (n==1) )

return n;

else

return f(n-1) + f(n-2);

}

:‌‌محاسبه‌جمله‌چهارم‌سري‌فیبوناچی‌

f(4)=f(3) + f(2) =2+1=3

f(3)=f(2) + f(1) =1+1=2

f(2)=f(1) + f(0) =1+0=1

2)2()1(

11

00

)(

nnfnf

n

n

nfفرادرس

FaraDars.org

Page 16: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

زاد و ولد خرگوش ها

16

:استزیرصورتبههاخرگوشجمعیترشدمدلوداردوجودنوزادمادهونرخرگوشجفتیکجزیرهیکدر.رسندمیبلوغسنبهتولدازپسماهيکهاخرگوش(1).استماهيکباردايدوران(2)

.شودمیباردارحتمارسدمیبلوغسنبهمادهخرگوشکههنگامی(3).آوردمیدنیابهمادهخرگوشيکونرخرگوشيکبارداري،هردرمادهخرگوش(4)

.میرندنمیهرگزهاخرگوش(5)

دهد؟نشانامnماهشروعدرراهاخرگوشتعدادکهبنويسیدبازگشتیرابطه

فرادرس

FaraDars.org

Page 17: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

(ادامه)زاد و ولد خرگوش ها

17

:پاسخ

مجموعبااستبرابرامnماهشروعدرهاخرگوشجفتتعداد

:زيرمقداردوقبلماههايخرگوشجفتتعداد-الفهايخرگوشجفتتعدادبااستبرابرکه)نوزادانجفتتعداد-ب

(قبلماهدوهايخرگوشکلبااستبرابرهمآنکهقبلماهبالغ:داريمبنابراين

1)2(,1)1( ff

)2()1()( nfnfnf

233,144,89,55,34,21,13,8,5,3,2,1,1

فرادرس

FaraDars.org

Page 18: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

در زیر برنامه های بازگشتی پشتهکاربرد

(stack):پشتهتعريف

.می‌شودانجامآنبااليازاضافهوحذفکهاستايدادهساختمانپشته

.می‌شودبرداشتهآنازکهاستعنصرياولینآن،درشدهواردعنصرآخرينچون،می‌نامندFILOراپشته

.شدخواهندبررسیمفصلطوربهپشتهفصلدرآنکاربردهايوپشتهدرعملیات

18

فرادرس

FaraDars.org

Page 19: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تمرین

19

.کنیدمشخصراf(1,1)خروجی

f(x,0)=f(x+1,0) + f(x+1,1) , if x<3

f(x,1)=2f(x+1,0) + f(x+1,1) , if x<3

f(3,0)=1

f(3,1)=0

فرادرس

FaraDars.org

Page 20: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

مثال

fفراخوانیازایبهزیر،برنامهزیرخروجی ؟چیست(1)

f (n){

if (n==3) exit( );

else{

n=n+1; f(n);

cout<<n;}

}

.‌‌بودخواهد‌32خروجی‌برابر‌بنابراين‌

20

3

2

)3()2()1( fff فرادرس

FaraDars.org

Page 21: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

مثال

چه‌می‌باشد؟f(4)خروجی‌

f (n){

if (n >2)

{

f(n-1);

cout << 'a' ;

cout << 'b' ;

}

}.می‌باشدababخروجی‌:‌پاسخ

21

)2()3()4( fff

a

b

a

b

فرادرس

FaraDars.org

Page 22: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

مثال

fفراخوانیازایبهزیر،برنامهزیرخروجی ؟چیست(1,4)

f (n,m){if (n==3)

exit( );else {

n=n+1;m=m+1; f(n,m);cout<<n;cout<<m;

}}

.‌بودخواهد‌3625خروجی‌برابر‌بنابراين‌

22

3

6

2

5

)6,3()5,2()4,1( fff فرادرس

FaraDars.org

Page 23: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تمرين

چیست؟ f(4)خروجی‌f (int x){

if (x) g(x–1);

cout<<x; }

g(int y){if (y)

{cout<<y+1;f(y–1);

}}

23

فرادرس

FaraDars.org

Page 24: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

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

.بنويسیدفاکتوريلتابعدرهاضربتعدادبرايبازگشتیرابطهيک

fact (n){

if (n==0) return 1;

else return n*fact(n-1);

}

:حل

عملاضافهبه(n-1)فراخوانیدرشدهانجامهايضربتعدادبااستبرابرشودمیامجانکههايیضربتعدادمعینnيکبراي:داريمدهیم،نمايشT(n)باراnمعینمقداريکبرايشدهانجامهايضربتعداداگربنابراين.fact(n-1)درnضرب

:گیردهیچ‌ضربی‌صورت‌نمی‌،باشدn=0وقتی

24

)1(1)( nTnT 0)0( T

فرادرس

FaraDars.org

Page 25: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

حرکت در صفحه شطرنجی

25

.باشدمیباالياراستسمتبهفقطمجازهايحرکت.برويمBنقطهبهAنقطهازخواهیممیزيرشطرنجیصفحهدر

.بنويسید(BبهAازممکنمسیرهايتعداد)T(n,m)برايبازگشتیرابطهيک

:بااستبرابربازگشتیرابطهاينجواب

)m,1n(T)1m,n(T)m,n(T

1),0( mT

1)0,( nT

m

nm

فرادرس

FaraDars.org

Page 26: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

مثال

26

.کنیدمشخصراT(n)بازگشتیرابطهباشد،f(n)توسطشدهچاپهايستارهتعدادT(n)اگر

f (n){

if (n>=2)

{

f (n-1);

f (n-1);

f (n-2);

cout<<"*";

}

}

0)1(

0)0(

1)2()1()1()(

T

T

nTnTnTnTفرادرس

FaraDars.org

Page 27: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

رابطه بازگشتی برای مسئله برج هانوی

27

:کندمی‌اگر‌به‌تابع‌برج‌هانوي‌نگاه‌کنیم،‌مشاهده‌می‌شود‌که‌تابع‌دو‌بار‌خودش‌را‌فراخوانی‌

:جواب‌اين‌رابطه‌برابر‌است‌با

1)1(2)( nTnT

12)( nnT

فرادرس

FaraDars.org

Page 28: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

تمرین

28

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

.ندارندمتوالیصفردوهیچکهnطولبه1و0هايدنبالهتعداد(1)

هايموزايیکباياندازهباشطرنجیصفحهيککردنفرشهايروشتعداد(2)

.باشدزوجآندرشدهظاهرصفرهايتعدادکهاستمعتبرزمانیnطولبا2و1و0ارقامشاملتايیسهکديکنیدفرض(3).کندمحاسبهراهستندمعتبرکهnطولبهکدهايتعدادبنويسیدکهبازگشتیرابطه

12 n2فرادرس

FaraDars.org

Page 29: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

روش های حل رابطه های بازگشتی

29

:کردحلزیرهایروشبهتوانمیرابازگشتیهایرابطهحدس-1

جايگذاريباتکرار-2اصلیقضیه-3

بازگشتدرخت-4

ناهمگنوهمگنبازگشتیهايرابطهحلهايروش-5

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

فرادرس

FaraDars.org

Page 30: آموزش ساختمان داده ها - بخش دوم

ساختمان داده ها

faradars.org/fvds9402

30

این اسالید ها بر مبنای نکات مطرح شده در فرادرس« مجموعه فرادرس های ساختمان داده ها»

.تهیه شده است

.نماییدلینک زیر مراجعه برای کسب اطالعات بیشتر در مورد این آموزش به

faradars.org/fvds9402

فرادرس

FaraDars.org