რეკურსიული პროგრამირება

Slides:



Advertisements
Similar presentations
Lecture Computer Science I - Martin Hardwick Strings #include using namespace std; int main () { string word; cout
Advertisements

Recursion.
For(int i = 1; i
Computer Science 1620 Math Library. Remember this program? suppose that I invest $25000 into a mutual fund that returns 8% per year. Write a program to.
Factorial Preparatory Exercise #include using namespace std; double fact(double); int fact(int); int main(void) { const int n=20; ofstream my_file("results.txt");
第三次小考. #include using namespace std; int aaa(int *ib,int a1,int a2) { int u,v; int m=(a1+a2)/2; if(a1==a2)return ib[a1]; u=aaa(ib,a1,m); cout
Declaring a Class: the.h file #pragma once #include using namespace std; class Student { private: string myFirst; string myLast; int myCredits; double.
Tinaliah, S. Kom.. * * * * * * * * * * * * * * * * * #include using namespace std; void main () { for (int i = 1; i
Triana Elizabeth, S.Kom. #include using namespace std; void main () { for (int i = 1; i
Programming Searching Arrays. COMP102 Prog. Fundamentals: Searching Arrays/ Slide 2 Copyright © 2000 by Broks/Cole Publishing Company A division of International.
1 Engineering Problem Solving With C++ An Object Based Approach Chapter 5 Functions.
Recursion. Idea: Some problems can be broken down into smaller versions of the same problem Example: n! 1*2*3*…*(n-1)*n n*factorial of (n-1)
Loops Programming. COMP104 Lecture 9 / Slide 2 Shortcut Assignment l C++ has a set of operators for applying an operation to a variable and then storing.
Building Java Programs Chapter 13 Searching reading: 13.3.
CS1201: Programming Language 2 Recursion By: Nouf Almunyif.
Current Assignments Homework 3 is due tonight. Iteration and basic functions. Exam 1 on Monday.
Liang, Introduction to Programming with C++, Second Edition, (c) 2010 Pearson Education, Inc. All rights reserved Chapter 6 Arrays.
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
Functions Jordi Cortadella Department of Computer Science.
Recursion Function calling itself
Andy Wang Object Oriented Programming in C++ COP 3330
Binary Search.
Functions in C ++ Subject: Programming Languages ​​for III year Topic: functions, member class.
#define #include<iostream> using namespace std; #define GO
QUEUES.
Basic file operations in C++
Lecture 7-2 : STL Iterators
Intro to Programming Week # 6 Repetition Structure Lecture # 10
Functions and an Introduction to Recursion
Andy Wang Object Oriented Programming in C++ COP 3330
לולאות קרן כליף.
درس طراحی الگوریتم ها (با شبه کد های c ++)
Programming fundamentals 2 Chapter 2:Function
Lecture Constructors and Destructors
Polymorphism Lec
Dynamic Memory Allocation Reference Variables
User-defined Functions
Lecture 7-2 : STL Iterators
CSC1201: Programming Language 2
Random Number Generation
פונקציות לעיתים קרובות לא נוח להגדיר את כל התוכנה בתוך גוף אחד.
Funkcijų naudojimas.
Introduction to Algorithms and Programming COMP151
Recursion.
User-defined Functions
Starting Out with C++: From Control Structures through Objects
Pointers & Functions.
Code::Block vs Visual C++
Control Structures Repetition
Pass by Reference.
Control Structures Part 3
CS1201: Programming Language 2
Arrays Lecture 11.
Functions and an Introduction to Recursion
Number in the Middle.
Lecture 8-2 : STL Iterators and Algorithms
Passing Arrays to functions
CSC1201: Programming Language 2
Recursion.
Introduction to Algorithms and Programming
Algorithms and Time Complexity
Using string type variables
Pointers & Functions.
(Dreaded) Quiz 2 Next Monday.
Main() { int fact; fact = Factorial(4); } main fact.
CS1201: Programming Language 2
Introduction to Algorithms and Programming COMP151
Programming Strings.
Introduction to Algorithms and Programming COMP151
Binary Search Binary Search Algorithm
Presentation transcript:

რეკურსიული პროგრამირება Recursio ლათინურად “დაბრუნება”-ს ნიშნავს რეკურსია წარმოადგენს მეთოდს, რომელსაც ზოგადი ამოცანა დაჰყავს უფრო მცირე ზომის, მარტივი ამოცანების ამოხსნაზე რეკურსიული ალგორითმი მუშაობის პროცესში საკუთარ თავს მიმართავს. რეკურსიის არსი იმაში მდგომარეობს, რომ ფუნქციის მიერ საკუთარი თავის ყოველი გამოძახებისას მეხსიერებაში იქმნება ფუნქციის ახალი ასლი შესაბამისი ლოკალური ცვლადებით, ხოლო მუშაობის დამთავრებისთანავე ეს მეხსიერება თავისუფლდება და შედეგები გადაეცემა გამოძახების წერტილს.

რეკურსია შეიძლება იყოს: პირდაპირი, როცა ფუნქცია იძახებს თავის თავს. ირიბი, როცა A ფუნქცია იძახებს B-ს, ხოლო B ფუნქცია A-ს.

რეკურსიის ლიტერატურულ მაგალითებად შეიძლება ჩაითვალოს “რწყილი და ჭიანჭველა”, “თხა და ვენახი”... ორ სარკეს შორის მოთავსებული საგანი წარმოშობს რეკურსიულ გამოსახულებათა უსასრულო როდენობას.

ფაქტორიალის გამოთვლა რეკურსიულად N! = 1, როცა N = 1 N * (N – 1)!, როცა N > 1 რეკურსიის დროს მნიშვნელოვანია ქვეპროგრამიდან (ფუქციიდან) გამოსვლის მომენტის მკაფიო განსაზღვრა, რათა ალგორითმი სასრული იყოს. int factorial( int a) { if (a == 1) return 1; else { a = a * factorial(a-1); return a; }

ფუნქციის პირველი გამოძახება ძირითადი პროგრამიდან უნდა მოხდეს. მაგ ფუნქციის პირველი გამოძახება ძირითადი პროგრამიდან უნდა მოხდეს. მაგ., α= fact(5) გამოვთვალოთ 5! 1 გამოძახება (n=5) Function fact { fact= 5 * fact(4); } 2 გამოძახება (n=4) fact(5) = 120 Function fact { fact= 4* fact(3); } 5 *24 3 გამოძახება (n=3) α= 120 Function fact { fact= 3* fact(2); } 4 *6 4 გამოძახება (n=2) Function fact { fact= 2* fact(1); } 5 გამოძახება (n=1) 3 *2 Function fact { fact= 1; } 2 *1

მაგალითი: ნატურალური რიცხვის გადაყვანა თვლის ათობითი სისტემიდან ორობითში. 39 38 19 18 9 8 4 2 1 3910 = 1001112 rec(int n) { if (n >1) rec(n/2); cout<<n%2; }

int rec(int n) { cout<<n%2; } { cout<<n%2; } { if (n>1) rec(n/2); cout<<n%2; } 2 გამოძახება (n = 19) int rec(int n) { if (n>1) rec(n/2); cout<<n%2; } 3 გამოძახება (n = 9) int rec(int n) { if (n>1) rec(n/2); cout<<n%2; } 4 გამოძახება (n = 4) int rec(int n) { if (n>1) rec(n/2); cout<<n%2; } 5 გამოძახება (n = 2) int rec(int n) { if (n>1) rec(n/2); cout<<n%2; } 6 გამოძახება (n = 1) int rec(int n) { cout<<n%2; }

ფიბონაჩის მიმდევრობა ვიპოვოთ ფიბონაჩის მიმდევრობის საწყისი N წევრი. ცნობილია, რომ ამ მიმდევრობის პირეველი ორი წევრი 1-ის ტოლია, ხოლო ყოველი მომდევნო წევრი წინა ორი წევრის ჯამის ტოლია (1, 1, 2, 3, 5, 8, 13, 21, …). ამოცანის რეკურსიული აღწერა: Ф(n) = 1, თუ n = 1 ან n = 2; Ф(n – 1) + Ф(n – 2), როცა n > 2

ფიბონაჩის მიმდევრობა ეს პროგრამა ნათლად ამჟღავნებს რეკურსიის ნაკლოვან მხარეს. K>70 მნიშვნელობებისათვის პროგრამა ძალზე დიდ დროს ანდომებს. საქმე იმაშია, რომ FIB[70]-ის გამოთვლისთვის რეკურსიულმა ფუნქციამ უნდა გამოთვალოს FIB[69] და FIB[68]. მიუხედავად იმისა, რომ FIB[68] ფუნქციას უკვე გამოთვლილი ჰქონდა FIB[69]-ის გამოთვლის დროს, ის ამ მნიშვნელობას თავიდან ითვლის და ასე იქცევა მიმდევრობის ყველა სხვა წევრის მიმართაც. სწორედ ეს გახლავთ რეკურსიის ნელი მუშაობის მიზეზი – ის უამრავჯერ ითვლის ფუნქციის მნიშვნელობას ერთი და იგივე არგუმენტისათვის. მართალია, მასივის შემოღება და მიღებული შედეგების მასში შენახვა მკვეთრად გააუმჯობესებს რეკურსიის მუშაობის სიჩქარესაც. ამ შემთხვევაში რეკურსიულ ვარიანტზე გაცილებით ეფექტურია იტერაციული ვარიანტი. #include<iostream> using namespace std; int k,x; int fibon(int n) { if(n<=2) return 1; return fibon(n-1)+fibon(n-2); } main (){ cin>>k; x=fibon(k); cout<<x<<endl;

რეკურსიის ხე ფიბონაჩის მიმდევრობისათვის 1 - 39088169 2 - 63245986 3 - 39088169 4 - 24157817 5 - 14930352 6 - 9227465 7 - 5702887 8 - 3524578 9 - 2178309 10 - 1346269 11 - 832040 12 - 514229 13 - 317811 14 - 196418 15 - 121393 16 - 75025 17 - 46368 18 - 28657 19 - 17711 20 - 10946 21 - 6765 22 - 4181 23 - 2584 24 - 1597 25 - 987 26 - 610 27 - 377 28 - 233 29 - 144 30 - 89 31 - 55 32 - 34 33 - 21 34 - 13 35 - 8 36 - 5 37 - 3 38 - 2 39 - 1 40 - 1 ცხრილებში ნაჩვენებია გამოძახებათა რაოდენობა n=40-სათვის

პროგრამა, რომელიც ახდენს მთელი რიცხვის ჩანაწერის შებრუნებას #include <iostream> using namespace std; int n; int revers(int n1) { cout<<n1%10; if (n1/10!=0) revers(n1/10); return 0; } int main(){ cin>>n; revers(n);

ორობითი ძებნა ორობითი ძებნა პოულობს საძებნი ელემენტის მდებარეობას (ინდექსს) დალაგებულ მასივში (ან სიაში) ყოველ ბიჯზე საძებნი არის ორჯერ შემცირებით. ორობითი ძებნა ახორციელებს O(log N) შედარებას. მაგალითი: მოვძებნოთ მასივში რიცხვი 43. index 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 value -7 -2 21 23 31 33 37 43 51 55 78 86 94 114 min mid max

ორობითი ძებნის კოდი #include <iostream> using namespace std; int bsearch(int L[],int x, int first, int last) { if (last >= first) { int middle = (first + last) / 2; if (x == L[middle]) return middle; else if (x < L[middle]) return bsearch(L, x, first, middle-1); else return bsearch(L, x, middle+1, last); } return -(first + 1); int main(){ int myList[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; int size, myfirst = 0, findthis; int n = myList[size]; int mylast = n - 1; cin >> findthis; int result = binarySearch(myList, findthis, myfirst, mylast);