100% found this document useful (1 vote)
347 views58 pages

Algorythm Design

Uploaded by

vahidvs
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
347 views58 pages

Algorythm Design

Uploaded by

vahidvs
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 58

‫الگوریتم های‬

‫بازگشتی‬
‫‪Recursive Algorithms‬‬
‫طراحی الگوریتم ها ‪ -‬دانشگاه فردوسی مشهد ‪ -‬صمد‬
‫پایدار‬
‫مطالب مورد بحث‬

‫مقدمه‬ ‫‪‬‬

‫بررسی چند مساله نمونه‬ ‫‪‬‬

‫محاسبه فاکتوریل عدد ‪N‬‬ ‫‪‬‬

‫معمای برج هانوی )‪(Tower of Hanoi‬‬ ‫‪‬‬

‫محاسبه بزرگترین مقسوم علیه مشترک به روش‬ ‫‪‬‬

‫اقلیدسی‬
‫دنباله اعداد فیبوناتچی‬ ‫‪‬‬

‫فرکتال ها‬ ‫‪‬‬

‫‪2‬‬
‫مقدمه‬

‫یکی از تکنیک های حل مساله‪ ،‬استفاده از‬ ‫‪‬‬

‫الگوریتم های بازگشتی می باشد‪.‬‬


‫الگوریتم هایی که با استفاده از توابع بازگشتی‬ ‫‪‬‬

‫طراحی و پیاده سازی می شوند‪.‬‬


‫تابع بازگشتی مستقیم‪ :‬در داخل بدنه تابع‪ ،‬مجددا همان‬ ‫‪‬‬

‫تابع‪ ،‬با پارامترهای متفاوتی فراخوانی می شود‬


‫)فراخوانی صریح(‪.‬‬
‫تابع بازگشتی غیر مستقیم )با واسطه(‪ :‬در داخل بدنه‬ ‫‪‬‬

‫تابع‪ ،‬تابع دیگری فراخوانی می شود که در داخل آن‪،‬‬


‫مجددا تابع اولیه با پارامترهای متفاوتی فراخوانی‬
‫میشود‪ .‬ممکن است تعداد توابع میانی بیش از یکی‬
‫باشد‪ .‬یعنی یک زنجیره فراخوانی داشته باشیم که‬
‫نهایتا به فراخوانی مجدد تابع اولیه منجر شوند‪.‬‬
‫‪3‬‬
‫مقدمه‬

‫هر تابع بازگشتی شامل دو قسمت است که در‬ ‫‪‬‬

‫هر بار فراخوانی تابع‪ ،‬تنها یکی از این دو قسمت‬


‫اجرا می شود‪.‬‬
‫قسمت پایه‪ :‬این حالت منجر به فراخوانی مجدد تابع‬ ‫‪‬‬

‫نمی شود‪.‬‬
‫قسمت بازگشتی‪ :‬این حالت منجر به فراخوانی‬ ‫‪‬‬

‫بازگشتی تابع می شود‪.‬‬


‫دنباله فراخوانی های بازگشتی یک تابع نهایتا باید‬ ‫‪‬‬

‫به قسمت پایه برسد‪ ،‬در غیر اینصورت ‪ ‬حلقه‬


‫پایان ناپذیری از فراخوانی های بازگشتی‬

‫‪4‬‬
‫مقدمه‬

‫مزایای الگوریتم های بازگشتی‬ ‫‪‬‬

‫سازگاری با طبیعت مساله‪ :‬برخی مسائل‪ ،‬ذاتا در‬ ‫‪‬‬

‫تعریف خود‪ ،‬از مفهوم بازگشتی استفاده می کنند که‬


‫توصیف آنها را ساده تر می کند‪.‬‬
‫بسیاری از مفاهیم‪ ،‬توابع و فرمول های ریاضی دارای طبیعت‬ ‫‪‬‬

‫بازگشتی هستند‪.‬‬
‫خوانایی زیاد‬ ‫‪‬‬

‫سادگی‬ ‫‪‬‬

‫کوتاهی کد الگوریتم از نظر تعداد دستورات‬ ‫‪‬‬

‫عیب الگوریتم های بازگشتی‬ ‫‪‬‬

‫استفاده از توابع بازگشتی منجر به فراخوانی های‬ ‫‪‬‬

‫مکرر توابع می شود ‪ ‬از نظر زمان اجرا و میزان‬


‫مصرف حافظه‪ ،‬سربار قابل توجهی ایجاد می شود‪.‬‬
‫‪5‬‬
‫مقدمه‬

‫اگر برای مساله ای بتوان یک الگوریتم بازگشتی ارائه‬ ‫‪‬‬


‫نمود‪ ،‬آنگاه برای آن مساله می توان یک الگوریتم غیر‬
‫بازگشتی )‪ (Iterative‬نیز ارائه نمود‪.‬‬
‫‪ Jacobini‬و ‪ Bohm‬در ‪ 1966‬نشان دادند که هر برنامه ای را‬ ‫‪‬‬
‫می توان به برنامه ای تبدیل کرد که در آن تنها از ساختار‬
‫( دنباله‪ sequence‬انتخاب )مثل ‪ if)،‬و تکرار )مثل )‪)while‬‬
‫‪.‬استفاده شده باشد‬
‫یعنی می توان از توابع استفاده نکرد‪.‬‬ ‫‪‬‬
‫دلیل استفاده از توابع‪ :‬امکان استفاده مجدد از کد‪ ،‬افزایش قابلیت‬ ‫‪‬‬
‫نگهداری‪ ،‬افزایش ساخت یافتگی برنامه‪... ،‬‬
‫البته ممکن است کیفیت الگوریتم غیر بازگشتی‬ ‫‪‬‬
‫مذکور‪ ،‬خیلی بد باشد )مثل الگوریتم خیلی پیچیده و‬
‫طولنی باشد(‬
‫آیا عکس این مطلب نیز درست است ؟؟‬ ‫‪‬‬

‫‪6‬‬
‫بررسی چند مساله نمونه‬

‫بررسی چند مساله نمونه‬ ‫‪‬‬

‫محاسبه فاکتوریل عدد ‪N‬‬ ‫‪‬‬

‫معمای برج هانوی )‪(Tower of Hanoi‬‬ ‫‪‬‬

‫محاسبه بزرگترین مقسوم علیه مشترک به روش‬ ‫‪‬‬

‫اقلیدسی‬
‫دنباله اعداد فیبوناتچی‬ ‫‪‬‬

‫فرکتال ها‬ ‫‪‬‬

‫‪7‬‬
‫محاسبه فاکتوریل عدد ‪n‬‬

‫تعریف بازگشتی‬ ‫‪‬‬


‫‪1‬‬ ‫‪n=0‬‬
‫‪n!= ‬‬
‫!)‪n * (n − 1‬‬ ‫‪n>0‬‬
‫الگوریتم بازگشتی‬ ‫‪‬‬

‫{ )‪long int fact(int n‬‬


‫;‪if (n == 0) return 1‬‬ ‫قسمت‬
‫‪else return n * fact(n-‬‬ ‫پایه‬
‫قسمت‬
‫;)‪1‬‬
‫بازگشتی‬
‫}‬

‫‪8‬‬
‫محاسبه فاکتوریل عدد ‪ ::n‬محاسبه‬
‫مرتبه زمانی‬
‫‪ ‬ورودی‪ :‬عدد ‪ n‬که می خواهیم فاکتوریل آن را‬
‫حساب کنیم‪.‬‬
‫‪ ‬اندازه ورودی‪ :‬مقدار عدد ‪n‬‬
‫‪ ‬عمل کلیدی‪ :‬عمل ضرب‬
‫‪ ‬محاسبه تابع پیچیدگی )‪ (T(n‬موجود می باشد(‬
‫‪‬‬ ‫)‪T(n) = 1 + T(n-1‬‬
‫‪ ‬یک رابطه بازگشتی است‪.‬‬
‫‪‬‬ ‫‪T(n) = T(n-1)+1 = T(n-2)+1+1 = T(n-‬‬
‫… = ‪3)+1+1+1‬‬
‫‪ T(n) = T(0) + n‬‬
‫)‪T(n) = n  T(n) = O(n‬‬
‫‪T(0) = 0‬‬ ‫مرتبه زمانی خطی‬
‫‪9‬‬
‫محاسبه فاکتوریل عدد ‪ n‬به روش‬
‫غیر بازگشتی‬
‫‪1‬‬ ‫تعریف غیر بازگشتی ‪n = 0‬‬ ‫‪‬‬

‫‪n!= ‬‬
‫‪1* 2 * ...(n− 1)* n n > 0‬‬
‫الگوریتم غیر بازگشتی‬ ‫‪‬‬

‫{ )‪long int fact(int n‬‬


‫;‪long int result = 1‬‬ ‫معادل قسمت پایه‬
‫)‪for(int i=2; i<=n ;i++‬‬ ‫الگوریتم بازگشتی‬
‫;‪result *= i‬‬
‫;‪return result‬‬
‫}‬ ‫معادل قسمت بازگشتی‬
‫الگوریتم بازگشتی‬
‫‪10‬‬
‫محاسبه محاسبه مرتبه زمانی الگوریتم‬
‫غیر بازگشتی‬
‫‪ ‬ورودی‪ :‬عدد ‪ n‬که می خواهیم فاکتوریل آن را‬
‫حساب کنیم‪.‬‬
‫‪ ‬اندازه ورودی‪ :‬مقدار عدد ‪n‬‬
‫‪ ‬عمل کلیدی‪ :‬عمل ضرب‬
‫‪ ‬محاسبه تابع پیچیدگی )‪ (T(n‬موجود می باشد(‬
‫مرتبه زمانی خطی )‪ T(n) = n-1  T(n) = O(n‬‬

‫‪ ‬هر دو الگوریتم بازگشتی و غیر بازگشتی‪ ،‬مرتبه‬


‫زمانی خطی دارند‪ .‬کدامیک بهتر به نظر می‬
‫رسد؟‬

‫‪11‬‬
‫بررسی چند مساله نمونه‬

‫بررسی چند مساله نمونه‬ ‫‪‬‬

‫محاسبه فاکتوریل عدد ‪N‬‬ ‫‪‬‬

‫معمای برج هانوی )‪(Tower of Hanoi‬‬ ‫‪‬‬

‫محاسبه بزرگترین مقسوم علیه مشترک به روش‬ ‫‪‬‬

‫اقلیدسی‬
‫دنباله اعداد فیبوناتچی‬ ‫‪‬‬

‫فرکتال ها‬ ‫‪‬‬

‫‪12‬‬
‫معمای برج هانوی )‪Tower of‬‬
‫‪(Hanoi‬‬
‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫سیستمی داریم شامل ‪ 3‬میله‬ ‫‪‬‬

‫و ‪ n‬دیسک که اندازه )شعاع(‬


‫آنها با هم متفاوت است‪ .‬تمام‬
‫‪ n‬دیسک بر روی یک میله و به‬
‫ترتیب بزرگ به کوچک )از پایین‬
‫به بال( روی هم قرار گرفته‬
‫اند‪.‬‬
‫هدف‪ :‬کلیه دیسک ها را از میله ‪ A‬به میله ‪ C‬منتقل کنیم بطوریکه باز هم‬ ‫‪‬‬

‫به ترتیب بزرگ به کوچک )از پایین به بال( روی هم قرار بگیرند‪ ،‬ضمنا در‬
‫انجام این کار باید دو قانون را رعایت کرد‪:‬‬
‫هر بار تنها یک دیسک را می توان از میله ای به میله دیگر منتقل کرد‪.‬‬ ‫‪‬‬

‫هرگز نمی توان دیسکی را بر روی دیسک کوچکتر از خودش قرار داد‪.‬‬ ‫‪‬‬

‫‪13‬‬
‫معمای برج هانوی‬

‫راه حل برای حالت ‪n=2‬‬ ‫‪‬‬

‫گام اول‪ :‬دیسک بالیی را از ‪ A‬به ‪ B‬منتقل‬ ‫‪‬‬

‫کن‪.‬‬
‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪14‬‬
‫معمای برج هانوی‬

‫گام دوم‪ :‬دیسک بزرگ را از ‪ A‬به ‪ C‬منتقل‬ ‫‪‬‬

‫کن‪.‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪15‬‬
‫معمای برج هانوی‬

‫گام سوم‪ :‬دیسک کوچک را از ‪ B‬به ‪ C‬منتقل‬ ‫‪‬‬

‫کن‪.‬‬
‫پایان‪) .‬میله ‪ B‬بعنوان میله کمکی و محل‬ ‫‪‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫استفاده‪A‬شد(‬


‫‪C‬موقت ‪B‬‬

‫‪16‬‬
‫معمای برج هانوی‬

‫راه حل برای حالت ‪ n=3‬با استفاده از حالت‬ ‫‪‬‬

‫‪n=2‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪17‬‬
‫معمای برج هانوی‬

‫بزرگترین دیسک را نادیده بگیر )تا مساله‬ ‫‪‬‬

‫شبیه حالت قبل شود(‪.‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪18‬‬
‫معمای برج هانوی‬

‫دو دیسک بالیی را به روشی که قبل برای‬ ‫‪‬‬

‫‪ n=2‬گفته شد‪ ،‬از ‪ A‬به ‪ B‬منتقل کن )بکمک‬


‫میله ‪(C‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪19‬‬
‫معمای برج هانوی‬

‫بزرگترین دیسک را از ‪ A‬به ‪ C‬منتقل کن‪.‬‬ ‫‪‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪20‬‬
‫معمای برج هانوی‬

‫بزرگترین دیسک را نادیده بگیر‪.‬‬ ‫‪‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪21‬‬
‫معمای برج هانوی‬

‫دو دیسک دیگر را به روشی که قبل برای ‪n=2‬‬ ‫‪‬‬

‫گفته شد‪ ،‬از ‪ B‬به ‪ C‬منتقل کن )بکمک میله‬


‫‪(A‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪22‬‬
‫معمای برج هانوی‬

‫پایان‪.‬‬ ‫‪‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪23‬‬
‫معمای برج هانوی‬

‫بطور کلی برای حل مساله برای ‪ n‬دیسک از‬ ‫‪‬‬

‫حل مساله برای ‪ n-1‬دیسک ‪ ،‬استفاده می‬


‫کنیم‪.‬‬
‫اگر ‪ ،n==1‬تنها دیسک موجود را از ‪ A‬به ‪ C‬منتقل‬ ‫‪‬‬

‫کن و کار تمام است‪.‬‬


‫‪A‬‬ ‫‪B‬‬ ‫اینصورت‪:‬‬
‫‪C‬‬ ‫در غیر‬ ‫‪‬‬

‫طی سه گام مساله را حل کن‪.‬‬ ‫‪‬‬

‫‪n-1 disks‬‬

‫‪24‬‬
‫معمای برج هانوی‬

‫گام اول‪ n-1 :‬دیسک بالیی را بکمک میله ‪C‬‬ ‫‪‬‬

‫به میله ‪ B‬منتقل کن‪.‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪25‬‬
‫معمای برج هانوی‬

‫گام دوم‪ :‬بزرگترین دیسک را از ‪ A‬به ‪ C‬منتقل‬ ‫‪‬‬

‫کن‪.‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪26‬‬
‫معمای برج هانوی‬

‫گام سوم‪ n-1 :‬دیسک دیگر را بکمک میله ‪ A‬به‬ ‫‪‬‬

‫میله ‪ C‬منتقل کن‪.‬‬


‫پایان‪.‬‬ ‫‪‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫‪27‬‬
‫معمای برج هانوی‬

‫درستی الگوریتم پیشنهادی را می توان با‬ ‫‪‬‬

‫استقرا بر روی ‪ ،n‬اثبات نمود‪.‬‬

‫‪28‬‬
‫معمای برج هانوی‬

‫الگوریتم‬ 

void hanoi (int n, disk A, disk B, disk C) {


if(n==1) move top disk from A to C;
else {
hanoi (n-1, A, C, B);
move top disk from A to C;
hanoi (n-1, B, A, C);
}
}

29
‫معمای برج هانوی ‪ ::‬محاسبه مرتبه‬
‫زمانی‬
‫ورودی‪ :‬تعداد دیسکها ‪ ،‬یعنی ‪n‬‬ ‫‪‬‬

‫اندازه ورودی‪ :‬مقدار ‪n‬‬ ‫‪‬‬

‫عمل کلیدی‪ :‬عمل ‪) move‬جابجایی یک دیسک(‬ ‫‪‬‬

‫محاسبه تابع پیچیدگی )‪ (T(n‬موجود است‪.‬‬ ‫‪‬‬

‫‪1‬‬ ‫‪n =1‬‬


‫‪T(n) = ‬‬
‫‪2 T(n - 1) + 1‬‬ ‫‪n >1‬‬

‫‪30‬‬
‫معمای برج هانوی ‪ ::‬محاسبه مرتبه‬
‫زمانی‬
‫‪‬‬ ‫‪T(n) = 2T(n-1)+1 = 2 (2T(n-2)+1) + 1‬‬
‫‪= 22T(n-2) + 3‬‬
‫‪= 23T(n-3) + 7 = 24T(n-4)+15= … =2k‬‬
‫‪T(n-k) + 2K -1‬‬
‫‪‬‬ ‫‪T(1) = 1‬‬ ‫)‪T(n‬‬ ‫=‬ ‫‪2‬‬‫‪n‬‬
‫‪-1‬‬
‫‪‬‬ ‫‪n-k=1  k=n-1‬‬ ‫‪‬‬ ‫‪T(n)=O(2‬‬ ‫‪n‬‬
‫)‬
‫‪‬‬ ‫‪T(n) = 2n-1T(1) + 2n-1 - 1‬‬

‫مرتبه زمانی الگوریتم ارائه شده‪ ،‬نمایی‬ ‫‪‬‬

‫)‪ (exponential‬می باشد‪.‬‬


‫‪31‬‬
‫معمای برج هانوی ‪ 3‬رنگی‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬ ‫حالت اولیه‬ ‫‪‬‬

‫‪A‬‬ ‫‪B‬‬ ‫‪C‬‬

‫حالت هدف‬ ‫‪‬‬

‫‪32‬‬
‫بررسی چند مساله نمونه‬

‫بررسی چند مساله نمونه‬ ‫‪‬‬

‫محاسبه فاکتوریل عدد ‪N‬‬ ‫‪‬‬

‫معمای برج هانوی )‪(Tower of Hanoi‬‬ ‫‪‬‬

‫محاسبه بزرگترین مقسوم علیه مشترک به روش‬ ‫‪‬‬

‫اقلیدسی‬
‫دنباله اعداد فیبوناتچی‬ ‫‪‬‬

‫فرکتال ها‬ ‫‪‬‬

‫‪33‬‬
‫محاسبه ب‪.‬م‪.‬م‪ .‬به روش اقلیدسی‬

‫محاسبه ب‪.‬م‪.‬م‪ .‬دو عدد صحیح غیرمنفی ‪ a‬و‪b‬‬ ‫‪‬‬

‫با فرض ‪a>=b‬‬


‫‪a‬‬ ‫‪b=0‬‬
‫‪gcd(a, b) = ‬‬ ‫تعریف بازگشتی‬ ‫‪‬‬
‫)‪gcd(b, a mod b‬‬ ‫‪else‬‬

‫‪‬‬ ‫‪gcd: greatest common divisor‬‬


‫مثال‪ :‬ب‪.‬م‪.‬م‪ .‬دو عدد ‪ 40‬و ‪18‬‬ ‫‪‬‬

‫‪‬‬ ‫= )‪gcd(40, 18) = gcd(18, 4) = gcd(4, 2‬‬


‫‪gcd(2, 0) = 2‬‬

‫‪34‬‬
‫ به روش اقلیدسی‬.‫م‬.‫م‬.‫محاسبه ب‬

‫الگوریتم بازگشتی‬ 

int gcd(int a, int b) {


if (b == 0) return a;
else return gcd(b, a % b);
}

35
‫محاسبه ب‪.‬م‪.‬م‪ .‬به روش اقلیدسی‬

‫نکته ‪ :1‬این الگوریتم بطور ضمنی‪ ،‬دنباله ای از‬ ‫‪‬‬

‫اعداد تولید می کند که نهایتا به صفر می رسند‪.‬‬


‫‪ gcd(40, 18)  40, 18, 4, 2, 0‬‬

‫‪ a , a , a , …, a‬‬
‫‪0‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪m‬‬

‫‪‬‬ ‫‪a0 = a , a1 = b, a2 = a mod b, … am=0‬‬


‫‪‬‬ ‫‪aj= aj-2 % aj-1‬‬ ‫‪j= 2,..,m‬‬

‫نکته ‪ :2‬برای اعداد طبیعی ‪ a‬و ‪:b‬‬ ‫‪‬‬

‫‪(a mod b) <= (a-1)/2‬‬

‫‪36‬‬
‫محاسبه ب‪.‬م‪.‬م‪ .‬به روش اقلیدسی‪::‬‬
‫محاسبه مرتبه زمانی‬

‫ورودی‪ :‬اعداد ‪ a‬و ‪b‬‬ ‫‪‬‬

‫اندازه ورودی‪ :‬مقدار ‪ ،a‬یعنی ‪n=a‬‬ ‫‪‬‬

‫عمل کلیدی‪ :‬عمل تعیین باقیمانده )‪(mod‬‬ ‫‪‬‬

‫‪37‬‬
‫محاسبه ب‪.‬م‪.‬م‪ .‬به روش اقلیدسی‪::‬‬
‫محاسبه مرتبه زمانی‬
‫محاسبه تابع پیچیدگی‬ ‫‪‬‬

‫تعداد اجرای عمل کلیدی‪ ،‬علوه بر مقدار ‪ a‬به مقدار ‪b‬‬ ‫‪‬‬

‫نیز بستگی دارد‪.‬‬

‫‪‬‬ ‫‪gcd(40,18) = gcd(18,4)=gcd(4,2)=gcd(2,0)=2‬‬


‫‪‬‬ ‫‪gcd(40,10) = gcd(10,0) = 10‬‬

‫در نتیجه به محاسبه ‪ (W(n‬می پردازیم‪.‬‬ ‫‪‬‬

‫می توان گفت حجم کار انجام شده توسط الگوریتم به ‪a‬‬ ‫‪‬‬

‫‪ %b‬بستگی دارد‪ ،‬اما از آنجا که ما بدنبال تعیین حد بال‬


‫هستیم‪ ،‬و از آنجا که ‪ ،a%b<=(a-1)/2‬بجای ‪ a%b‬توجه‬
‫خود را بر ‪ a‬متمرکز می کنیم‪.‬‬

‫‪38‬‬
‫محاسبه ب‪.‬م‪.‬م‪ .‬به روش اقلیدسی‪::‬‬
‫محاسبه مرتبه زمانی‬
‫‪‬‬ ‫)‪W(n) = 1 + W(n / 2‬‬
‫‪‬‬ ‫= ‪W(n) = W(n/2)+1 = W(n/4)+1+1‬‬
‫‪W(n/8)+1+1+1=...‬‬
‫‪‬‬ ‫‪W(n) = W(n/2k)+k‬‬
‫‪‬‬ ‫‪W(1) = 1‬‬ ‫)‪W(n‬‬ ‫=‬ ‫‪1+log‬‬ ‫‪n‬‬
‫‪2‬‬

‫‪‬‬ ‫‪n/2 =1  k=log 2‬‬


‫‪k‬‬ ‫‪n‬‬ ‫‪‬‬ ‫‪W(n)=O(log‬‬‫‪n‬‬
‫)‪2‬‬

‫مرتبه زمانی بدترین حالت‪ ،‬لگاریتمی می باشد‪.‬‬

‫‪39‬‬
‫بررسی چند مساله نمونه‬

‫بررسی چند مساله نمونه‬ ‫‪‬‬

‫محاسبه فاکتوریل عدد ‪N‬‬ ‫‪‬‬

‫معمای برج هانوی )‪(Tower of Hanoi‬‬ ‫‪‬‬

‫محاسبه بزرگترین مقسوم علیه مشترک به روش‬ ‫‪‬‬

‫اقلیدسی‬
‫دنباله اعداد فیبوناتچی‬ ‫‪‬‬

‫فرکتال ها‬ ‫‪‬‬

‫‪40‬‬
‫ به روش اقلیدسی‬.‫م‬.‫م‬.‫محاسبه ب‬
0 if n = 0
 ‫تعریف بازگشتی‬ 
f ib(n) = 1 if n = 1
fib(n − 1) + fib(n − 2) else

Fibonacci sequence :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

‫الگوریتم بازگشتی‬ 

long int fib(int n) {


if ( n <= 1) return n;
else return fib(n-1)+fib(n-2);
}
41
‫دنباله اعداد فیبوناتچی‬

‫محاسبه پیچیدگی زمانی‬ ‫‪‬‬

‫ورودی‪ :‬عدد ‪ n‬که می خواهیم مقدار ‪ (fib(n‬را‬ ‫‪‬‬

‫حساب کنیم‪.‬‬
‫اندازه ورودی‪ :‬مقدار عدد ‪n‬‬ ‫‪‬‬

‫عمل کلیدی‪ :‬عمل جمع‬ ‫‪‬‬

‫تابع پیچیدگی‪:‬‬ ‫‪‬‬

‫)‪T(n) = 1 + T(n-1) + T(n-2‬‬

‫‪42‬‬
‫دنباله اعداد فیبوناتچی‬

T(n) = 1 + T(n-1) + T(n-2)


<= 1+T(n-1)+T(n-1) <= 2T(n-1) +1
<= 2(2T(n-2)+1) +1 <= …
T(n) <= 2kT(n-k) + 2k-1
n-k = 0  k = n T(n) <= 2n

T(0) = 0  T(n) = O(2 n


)
‫مرتبه زمانی نمایی‬

43
‫دنباله اعداد فیبوناتچی‬

‫الگوریتم غیر بازگشتی‬ 

long int fib(int n) {


if ( n <= 1) return n;
long int F1 = 0, F2 = 1, result ;
for(int i=1;i<n;i++) {
result = F1 + F2;
F1 = F2;
F2 = result;
}
return result;
}
44
‫دنباله اعداد فیبوناتچی‬

‫محاسبه مرتبه زمانی الگوریتم غیر بازگشتی‬ ‫‪‬‬

‫ورودی‪ :‬عدد ‪n‬‬ ‫‪‬‬

‫اندازه ورودی‪ :‬مقدار عدد ‪n‬‬ ‫‪‬‬

‫عمل کلیدی‪ :‬عمل جمع )‪(result = F1+F2‬‬ ‫‪‬‬

‫تابع پیچیدگی‪:‬‬ ‫‪‬‬

‫‪ T(n) = n-1‬‬

‫مرتبه زمانی‪:‬‬ ‫‪‬‬

‫مرتبه زمانی ‪ T(n) = n-1  T(n) = O(n) ‬‬

‫خطی‬

‫‪45‬‬
‫دنباله اعداد فیبوناتچی‬

‫یک الگوریتم بازگشتی دیگر با استفاده از رابطه‬ ‫‪‬‬

‫بازگشتی زیر‬
‫‪n‬‬ ‫‪-‬‬ ‫‪1‬‬
‫)‪Fib(n‬‬ ‫‪Fib(n - 1)  1‬‬ ‫‪1‬‬
‫)‪Fib(n - 1‬‬ ‫‪‬‬ ‫‪=‬‬
‫‪‬‬ ‫‪Fib(n - 2) 1‬‬ ‫‪0‬‬

‫=)‪Fib(4‬‬
‫‪3‬‬ ‫مثال‪:‬‬ ‫‪‬‬

‫‪1‬‬ ‫‪1  4 - 1 1‬‬ ‫‪1  3 3‬‬ ‫‪2‬‬ ‫=)‪Fib(3‬‬


‫‪1‬‬ ‫‪‬‬ ‫‪=‬‬ ‫‪‬‬ ‫‪=‬‬
‫‪1 ‬‬
‫‪2‬‬
‫‪‬‬ ‫‪0‬‬ ‫‪1‬‬ ‫‪0‬‬ ‫‪2‬‬
‫=)‪Fib(2‬‬
‫=)‪Fib(3‬‬ ‫‪1‬‬
‫‪2‬‬
‫‪46‬‬
‫دنباله اعداد فیبوناتچی‬

‫برای محاسبه ‪ (Fib(n‬باید یک ماتریس ‪ 2‬در ‪ 2‬را به‬ ‫‪‬‬

‫توان ‪ n-1‬برسانیم‪ .‬حاصل هر مرحله‪ ،‬باز هم یک‬


‫ماتریس ‪ 2‬در ‪ 2‬است‪ .‬بنابراین حجم کار در هر مرحله‬
‫یکسان است‪ .‬از طرفی‪ ،‬الگوریتمی برای توان رسانی‬
‫با مرتبه زمانی لگاریتمی موجود است‪ ،‬در نتیجه مرتبه‬
‫زمانی این الگوریتم نیز لگاریتمی خواهد بود‪.‬‬

‫‪47‬‬
‫بررسی چند مساله نمونه‬

‫بررسی چند مساله نمونه‬ ‫‪‬‬

‫محاسبه فاکتوریل عدد ‪N‬‬ ‫‪‬‬

‫معمای برج هانوی )‪(Tower of Hanoi‬‬ ‫‪‬‬

‫محاسبه بزرگترین مقسوم علیه مشترک به روش‬ ‫‪‬‬

‫اقلیدسی‬
‫دنباله اعداد فیبوناتچی‬ ‫‪‬‬

‫فرکتال ها‬ ‫‪‬‬

‫‪48‬‬
‫فرکتال ها‬

‫یک شکل هندسی که می توان آن را به چند‬ ‫‪‬‬

‫قسمت تقسیم کرد که هر یک از آن قسمت‬


‫ها‪ ،‬از نظر ظاهری یا از نظر ساختار‪ ،‬یک کپی‬
‫کوچکتر از شکل اولیه می باشد‪.‬‬
‫مبتنی بر روشها و فرمولهای بازگشتی می‬ ‫‪‬‬

‫باشند‪.‬‬

‫‪49‬‬
‫فرکتال ها‬

‫‪50‬‬
‫فرکتال ها‬

‫‪51‬‬
‫فرکتال ها‬

‫‪52‬‬
‫فرکتال ها‬

‫‪53‬‬
‫فرکتال ها‬

‫‪54‬‬
‫فرکتال ها‬

‫‪55‬‬
‫فرکتال ها‬

‫‪56‬‬
‫فرکتال ها‬

‫‪57‬‬
‫فرکتال ها‬

‫‪58‬‬

You might also like