Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Recursion - Αναδρομή.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Αναδρομικοί Αλγόριθμοι
Advertisements

Βασικές Αρχές Ψηφιακής Τεχνολογίας
Στατική Συμβολική Παραγώγιση Λάμδα Εκφράσεων στην C++
264 δευτερόλεπτα, δηλ χιλιετίες
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Δευτέρα, 30 Ιουνίου 2014Δευτέρα, 30 Ιουνίου 2014Δευτέρα, 30 Ιουνίου 2014Δευτέρα, 30 Ιουνίου 2014Τμ.
ΜΑΘΗΜΑ 7ο Κυκλικές και Διπλά Συνδεδεμένες Λίστες,
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
DATA MINING LECTURE 6 Mixture of Gaussians and the EM algorithm
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Γιάννης Σταματίου Μη αποδοτική αναδρομή και η δυναμική προσέγγιση Webcast 8.
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
Μήτρες (templates)  Μία μήτρα είναι ένα κομμάτι κώδικα που περιέχει παραμέτρους οι οποίες δέχονται ως τιμές τύπους δεδομένων.  Είναι ένας μηχανισμός.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Δομημένος Προγραμματισμός και Δομές.
1 Ολυμπιάδα Πληροφορικής Μάθημα 3. 2 Στόχοι μαθήματος Δομή Επανάληψης Εντολή while Εντολή for.
Υποθετικός τελεστής Ο υποθετικός τελεστής (?:) αποτελείται από δύο σύμβολα. Ανήκει στην κατηγορία των τελεστών που αποτελούνται από συνδυασμό συμβόλων.
Ολυμπιάδα Πληροφορικής
Δείκτες, Πίνακες σε Δείκτες, Δείκτες σε Συναρτήσεις
Σχεδίαση αλγορίθμων (2ο μέρος)
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
Ολυμπιάδα Πληροφορικής
Ολυμπιάδα Πληροφορικής
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Stacks - Στοίβες.
ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ Is-like-a inheritance. Θεματολόγιο Κληρονομικότητα Παράδειγμα Κληρονομικότητα – Βελτιωμένο Παράδειγμα Ενθυλάκωση : public – private -
ΣΥΝΑΡΤΗΣΕΙΣ.
1 Ολυμπιάδα Πληροφορικής Μάθημα 5. 2 Στόχοι μαθήματος Πίνακες 2 διαστάσεων.
ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Και ομοιότητες και διαφορές με την C.
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Γράφοι – Graphs (Εισαγωγή)
Είσοδος & Έξοδος στη C++ Ι
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Γράφοι – Διάσχιση.
Γιάννης Σταματίου Αναδρομή και αναδρομικές σχέσεις
ΜΑΘΗΜΑ: ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C++ ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Πέμπτη, 2 Απριλίου 2015Τμ.
Templates Standard Template Library (STL) Exceptions Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμήμα Εφαρμοσμένης Πληροφορικής.
ΑΝΑΚΕΦΑΛΑΙΩΣΗ 26 Οκτωβρίου Αντικειμενοστρεφής Προγραμματισμός Ένα νέο προγραμματιστικό μοντέλο (paradigm) το οποίο στηρίζεται στις κλάσεις και τα.
Κεφάλαιο 10 – Υποπρογράμματα
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Πέρασμα παραμέτρων, συναρτήσεις δόμησης και αποδόμησης.
Υπερφόρτωση Τελεστών (Συνέχεια) Αντικειμενοστραφής Προγραμματισμός.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
ΛΟΓ102: Τεχνολογία Λογισμικού Ι Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ102:
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
Οι εντολές επανάληψης Σε πολλά προβλήματα απαιτείται η επανάληψη ενός συνόλου ενεργειών προκειμένου να λυθεί το πρόβλημα. Θα αναφέρουμε δύο χαρακτηριστικά.
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 getchar() /* char_count.c A program to count characters of input. */ main() { int c ; int count = 0; while.
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Διδάσκοντες:Γιάννης Μαΐστρος Στάθης Ζάχος Νίκος Παπασπύρου
Αναδρομικές Συναρτήσεις Σύνταξη: RECURSIVE type FUNCTION name1 (variables) RESULT (name2) IMPLICIT NONE Τμήμα δηλώσεων Εκτελέσιμες εντολές END FUNCTION.
Ξεχωριστή Μεταγλώττιση & Χώροι Ονομάτων Αντικειμενοστραφής Προγραμματισμός.
Πληροφορική 2 Γλώσσες Προγραμματισμού 1. Γλώσσες προγραμματσιμού  Επιτρέπουν την κωδικοποίηση των αλγορίθμων  Η εκτέλεση ενός προγράμματος θα πρέπει.
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Συναρτήσεις.
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Prolog Επεξεργασία και Αναπαράσταση Γνώσης
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Ενότητα Εισαγωγή Είναι εύκολη στη χρήση και στην εκμάθηση.
Ενισχυτική διδασκαλία
Τεχνολογία και Προγραμματισμός Υπολογιστών
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
Η Γλώσσα Pascal Υποπρογράμματα
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Ισορροπημένα Δένδρα Μπορούμε να επιτύχουμε χρόνο εκτέλεσης
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Αρχές Προγραμματισμού (C)
Αναδρομή Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:
Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου
Μεταγράφημα παρουσίασης:

Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Recursion - Αναδρομή

Διδάσκων: Παύλος Παυλικκάς2 Αναδρομικές συναρτήσεις Αναδρομή (recursion) η τεχνική επίλυσης προβλημάτων σύμφωνα με την οποία τα μεγάλα προβλήματα λύνονται με αναγωγή τους σε μικρότερα προβλήματα της ίδιας μορφής. Αναδρομική συνάρτηση (recursive function) συνάρτηση η οποία καλεί τον εαυτό της

Διδάσκων: Παύλος Παυλικκάς3 Τυπική Αναδρομική Συνάρτηση if (έλεγχος απλής περίπτωσης) (απλή λύση που υπολογίζεται χωρίς τη χρήση αναδρομής) else (αναδρομική λύση με κλήση της ίδιας συνάρτησης)

Διδάσκων: Παύλος Παυλικκάς4 Παράδειγμα λύσης παραγοντικού με τη χρήση αναδρομής Αναδρομικός ορισμός παραγοντικού 0!=1 n!=n*(n-1)!, n>0

Διδάσκων: Παύλος Παυλικκάς5 #include using namespace std; int factorial( int n ); int main() { int num; cin >> num; cout << factorial( num ); return 0; } int factorial( int n ) { if ( n == 1 ) return 1; else return n * factorial( n-1 ); }

Διδάσκων: Παύλος Παυλικκάς6

7 Δύναμη αριθμού #include using namespace std; int power( int x, int n ); int main() { int a, b; cin >> a >> b; cout << power( a, b ); return 0; } int power( int x, int n ) { if ( n == 0 ) return 1; else return x * power( x, n-1 ); } π.χ. 2 3 Power(2,3)=2*Power(2,2) Power(2,2)=2*Power(2,1) Power(2,1)=2*Power(2,0) Power(2,0)=1  Power(2,3)=8

Διδάσκων: Παύλος Παυλικκάς8 Αριθμοί Fibonacci Ακολουθία αριθμών οι πρώτοι δύο όροι είναι το 0 και το 1 κάθε επόμενος όρος είναι το άθροισμα των δύο προηγούμενων f(0) = 0 f(1) = 1 f(2) = f(0) + f(1) = = 1 f(3) = f(1) + f(2) = = 2

Να δημιουργήσετε το πρόγραμμα που τυπώνει το n όρο της σειράς fibonacci. Το n δίνεται από το πρόγραμμα. #include using namespace std; int fibo( int n ); int main() { int a; cin >> a; cout << fibo( a ); return 0; } int fibo( int n ) { if ( n <= 1 ) return n; else return ( fibo( n-1 ) + fibo( n-2 ) ); } Διδάσκων: Παύλος Παυλικκάς9

Διδάσκων: Άκης Συκοπετρίτης10 Βρείτε το αποτέλεσμα του παρακάτω προγράμματος για Num=3 #include using namespace std; int f( int n ); int main() { int a; cin >> a; cout << f( a ); return 0; } int f( int n ) { if ( ( n == 1 ) || ( n == 0 ) ) return 1; else if ( n%2 == 0) return f( n/2 ) + 2; else return f( n-1 ) + 3; } Num=3 F(3)=F(2)+3 F(2)=F(1)+2 F(1)=1 F(3)=6

Μέγιστος κοινός διαιρέτης Μια ιδέα για να βρούμε τον μέγιστο κοινό διαιρέτη δύο αριθμών α, β είναι να δοκιμάσουμε όλους τους αριθμούς από το 1 μέχρι τον μικρότερο από τους α, β και να δούμε ποιος είναι ο μεγαλύτερος που διαιρεί και τους 2. Διδάσκων: Παύλος Παυλικκάς11

Μέγιστος κοινός διαιρέτης #include using namespace std; FILE *fin, *fout; void mkd( int x, int y, int result ); int main() { int a, b, c=0, z; fin = fopen( "mkd.in", "r" ); fout = fopen( "mkd.out", "w" ); fscanf( fin, "%d%d", &a, &b ); if( a>b ) c = b; else c = a; mkd( a, b, c ); fclose( fin ); fclose( fout ); return 0; } void mkd(int x, int y, int result) { if( (x % result == 0) && (y % result == 0) ) fprintf( fout, "%d\n", result ); else mkd( x, y, result-1 ); } Διδάσκων: Παύλος Παυλικκάς12

Διδάσκων: Παύλος Παυλικκάς13 Πύργοι του Hanoi Περιγραφή Να μεταφερθούν οι n δακτύλιοι από τον πρώτο στον τρίτο στύλο, χρησιμοποιώντας το δεύτερο ως βοηθητικό χώρο Κανόνες Ένας δακτύλιος τη φορά Δεν μπορεί να τοποθετηθεί μεγαλύτερος δακτύλιος πάνω από μικρότερο

Διδάσκων: Παύλος Παυλικκάς14 Για να λύσουμεαυτότοπρόβλημα σκεπτόμαστε ως εξής: Αρχικά, μεταφέρουμε τους ν ‐ 1 δίσκους στην μεσαία στήλη (Έστω B). (Δεν μας νοιάζει το πώς θα γίνει αυτό, κρατάμε μόνο την ιδέα για αρχή).

Στη συνέχεια μεταφέρουμε τον ν ‐ οστό δίσκο από την πρώτη στήλη (A) στην τρίτη (C). Διδάσκων: Παύλος Παυλικκάς15

Τέλος, μεταφέρουμε τους ν ‐ 1 δίσκους από την μεσαία στήλη (B), στην τελευταία (C). (Και πάλι δεν μας νοιάζει το πώς θα γίνει αυτό, κρατάμε μόνο την ιδέα). Διδάσκων: Παύλος Παυλικκάς16

Έστω τώρα μια διαδικασία (με όνομα moveDiscs), η οποία μεταφέρει x δίσκους από μία στήλη σε μία άλλη. Η διαδικασία αυτή θα έχει ως παραμέτρους τον αριθμό των δίσκων που θα μεταφερθούν, την στήλη αφετηρίας, την στήλη προορισμού, και την στήλη που δεν θα χρησιμοποιηθεί. moveDiscs(αριθμός_δίσκων, στήλη_αφετηρίας, στήλη_προορισμού, στήλη_που_δεν_χρησιμοποιώ) Διδάσκων: Παύλος Παυλικκάς17

Όταν ο αριθμός των δίσκων που θέλουμε να μεταφέρουμε γίνει ίσος με 1, δηλαδή μεταφέρουμε ένα μόνο δίσκο, τότε αυξάνουμε τον αριθμό κινήσεων που έχουμε κάνει και η moveDiscs σταματά. Σε κάθε άλλη περίπτωση ακολουθούμε την λογική που περιγράφτηκε πιο πάνω. Διδάσκων: Παύλος Παυλικκάς18

Αρχικά, μεταφέρουμε τους ν ‐ 1 δίσκους στην μεσαία στήλη (Έστω B). Δηλαδή εκτελούμε την moveDiscs(n ‐ 1, A, B, C); Διδάσκων: Παύλος Παυλικκάς19

Στη συνέχεια μεταφέρουμε τον ν ‐ οστό δίσκο από την πρώτη στήλη (A) στην τρίτη (C). Δηλαδή εκτελούμε την moveDiscs(1, A, C, B); Διδάσκων: Παύλος Παυλικκάς20

Τέλος, μεταφέρουμε τους ν ‐ 1 δίσκους από την μεσαία στήλη (B), στην τελευταία (C). Δηλαδή εκτελούμε την moveDiscs(n ‐ 1, B, C, A); Διδάσκων: Παύλος Παυλικκάς21

Διδάσκων: Παύλος Παυλικκάς22 #include using namespace std; void hanoi( int n, int bar1, int bar2, int bar3 ); int main() { hanoi(3, 1, 3, 2); return 0; } void hanoi( int n, int bar1, int bar2, int bar3 ) { if ( n==1 ) cout " << bar2 << "\n"; else { hanoi( n-1, bar1, bar3, bar2 ); hanoi( 1, bar1, bar2, bar3 ); hanoi( n-1, bar3, bar2, bar1 ); }

Το πρόβλημα των Ν-βασιλισσών Έχουμε μια σκακιέρα με Ν γραμμές και Ν στήλες. Σκοπός μας είναι να τοποθετήσουμε Ν βασίλισσες στην σκακιέρα έτσι ώστε καμία να μην απειλείται από καμία άλλη. Προφανώς σε κάθε γραμμή και σε κάθε στήλη θα υπάρχει μόνο μια βασίλισσα. Διδάσκων: Παύλος Παυλικκάς23

Αρχικά, ξεκινάμε από την πρώτη στήλη της σκακιέρας και δοκιμάζουμε να τοποθετήσουμε την βασίλισσα στην πρώτη γραμμή. Μετά, πηγαίνουμε στην δεύτερη στήλη και δοκιμάζουμε να τοποθετήσουμε την βασίλισσα στην πρώτη πάλι γραμμή. Προφανώς αυτό δεν γίνεται οπότε προσπαθούμε να τοποθετήσουμε την βασίλισσα στην δεύτερη γραμμή. Ούτε και αυτό γίνεται οπότε τοποθετούμε την βασίλισσα στην τρίτη γραμμή Διδάσκων: Παύλος Παυλικκάς24

Συνεχίζουμε την διαδικασία για τις επόμενες βασίλισσες στις επόμενες στήλες. Αν διαπιστώσουμε ότι δεν μπορούμε να τοποθετήσουμε πουθενά μια βασίλισσα, τότε αφαιρούμε την αμέσως προηγούμενη βασίλισσα που τοποθετήσαμε και την τοποθετούμε σε μια άλλη θέση. Μετά συνεχίζουμε κανονικά την διαδικασία. Όταν φτάσουμε στην Ν+1 ‐ οστή στήλη (πράγμα που σημαίνει ότι έχουμε ήδη τοποθετήσει την Ν ‐ οστή βασίλισσα) σταματάμε. Το πρόβλημα έχει λυθεί. Διδάσκων: Παύλος Παυλικκάς25

Η λύση να γίνει από τους μαθητές Διδάσκων: Παύλος Παυλικκάς26