ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)

Slides:



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

Το αλφαριθμητικό (string)
Παράδειγμα 2: Υπολογισμός αθροίσματος με επαναληπτική εντολή: για...από...μέχρι... με βήμα Να βρεθεί και να εκτυπωθεί το άθροισμα των άρτιων αριθμών από.
Αλγόριθμοι Αναζήτησης
Να καταργήσουμε τη ΓΛΩΣΣΑ και να κρατήσουμε μόνο την ψευδογλώσσα
Πολυδιάστατοι Πίνακες, Δομές, Ενώσεις
ΜΑΘ3122/106 Γλώσσα Προγραμματισμού
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
Αναδρομη και static Γραψετε την συναρτηση sequence_size που διαβαζει μια απροσδιοριστου μεγεθους σειρας και υπολογιζει και τυπωνει το μεγεθος της. int.
ΜΑΘ-3122/106 Προγραμματισμός
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
Γιάννης Σταματίου Μη αποδοτική αναδρομή και η δυναμική προσέγγιση Webcast 8.
Συναρτήσεις Κληση/Επιστροφη Παραμετροι
Μήτρες (templates)  Μία μήτρα είναι ένα κομμάτι κώδικα που περιέχει παραμέτρους οι οποίες δέχονται ως τιμές τύπους δεδομένων.  Είναι ένας μηχανισμός.
ΗΥ-150 Προγραμματισμός Εντολές Ελέγχου Ροής.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Δομημένος Προγραμματισμός και Δομές.
Αλγόριθμοι και Πολυπλοκότητα
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Ταξινόμηση και Αναζήτηση.
Δυναμικός Προγραμματισμός
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
Δείκτες, Πίνακες σε Δείκτες, Δείκτες σε Συναρτήσεις
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Recursion - Αναδρομή.
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
ΣΥΝΑΡΤΗΣΕΙΣ.
Πάνω προς Κάτω Σχεδιασμός και Συναρτήσεις
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Δυναμική Διαχείριση Μνήμης (1/2)
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
Γιάννης Σταματίου Αναδρομή και αναδρομικές σχέσεις
Ταξινόμηση και Αναζήτηση
Διδακτική της Πληροφορικής ΗΥ302 Εργασία :Παρουσίαση σχολικού βιβλίου Γ’ Λυκείου Τεχνολογικής Κατεύθυνσης «Ανάπτυξη εφαρμογών σε προγραμματιστικό περιβάλλον»
Templates Standard Template Library (STL) Exceptions Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμήμα Εφαρμοσμένης Πληροφορικής.
ΗΥ150 – Προγραμματισμός Ξ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Δομές Δεδομένων.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Εντολές Ελέγχου Ροής.
Κεφάλαιο 10 – Υποπρογράμματα
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - 4ο εξάμηνο1 Ανάλυση Αλγορίθμων b Θέματα: Ορθότητα Χρονική αποδοτικότητα Χωρική αποδοτικότητα Βελτιστότητα b Προσεγγίσεις:
ΜΑΘ3122/106 – Γλώσσα προγραμματισμούΞενοφών Ζαμπούλης ΜΑΘ3122/106 Γλώσσα προγραμματισμού Συναρτήσεις.
1 ΤΜΗΜΑ ΜΠΕΣ Αλγόριθμοι Αναζήτησης Εργασία 1 Τυφλή Αναζήτηση.
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 Δείκτες σε συναρτήσεις Δείκτης σε συνάρτηση – Περιέχει τη διεύθυνση του κώδικα της συνάρτησης – Ό π ως ένας.
ΜΑΘ3122/106 – Γλώσσα προγραμματισμού Ξενοφών Ζαμπούλης ΜΑΘ3122/106 – Γλώσσα προγραμματισμού Επανάληψη.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
HY Γλώσσες και Μεταφραστές Φροντιστήριο Runtime Environment.
2/28/00epl-1311 Παραδειγματα Aλγοριθμων Αριθμος λεξεων που διαβαστηκαν απο εισοδο Εκτυπωση περιφερειας τετραγωνων με * Υπολογισμος exp(x,n) = 1 + x/1!
ΗΥ 150 – Προγραμματισμός Ξενοφών Ζαμπούλης ΗΥ -150 Προγραμματισμός Αρχεία.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Δομές Δεδομένων.
ΗΥ150 – ΠρογραμματισμόςΞ. Ζαμπούλης ΗΥ-150 Προγραμματισμός Αρχεία.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αλφαριθμητικά (Strings)
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 1 getchar() /* char_count.c A program to count characters of input. */ main() { int c ; int count = 0; while.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ -150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Προγραμματισμός ΗΥ Ενότητα 2: Συναρτήσεις Εισόδου ⁄ Εξόδου. Διδάσκων: Ηλίας Κ Σάββας, Αναπληρωτής Καθηγητής.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Συναρτήσεις.
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Ενισχυτική διδασκαλία
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΜΕ ΤΗ C
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Αναδρομή Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:
Μεταγράφημα παρουσίασης:

ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 2 Κλήσεις Συναρτήσεων Όταν καλείται μια συνάρτηση, πρέπει – Να θυμάται σε ποιο σημείο του προγράμματος θα επιστρέψει – Να δεσμεύσει χώρο για την τιμή που θα επιστρέψει – Να δεσμεύσει χώρο για τα ορίσματα της – Να δεσμεύσει χώρο για τις τοπικές μεταβλητές της Η μνήμη για στατικές και καθολικές μεταβλητές δεσμεύεται από την αρχή της εκτέλεσης του προγράμματος

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 3 Παράδειγμα Stack Frame for function f Επιστρεφόμενη Τιμή (a+x) Διεύθυνση Επιστροφής Ορίσματα x Τοπικές Μεταβλητές: a

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 4 Εμφωλιασμένες Κλήσεις Συναρτήσεων Ε π ιστρεφόμενη Τιμή (a+x) Διεύθυνση Ε π ιστροφής Ορίσματα x Το π ικές Μεταβλητές : a Ε π ιστρεφόμενη Τιμή a+b+c Διεύθυνση Ε π ιστροφής Ορίσματα x Το π ικές Μεταβλητές : a, b, c Stack Frame of g Stack Frame of f

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 5 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); }

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 6 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 7 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 8 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Frame Stack: g Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 9 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Frame Stack: g Frame Stack: q Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 10 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Frame Stack: g Frame Stack: q Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 11 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Frame Stack: g Execution Frame Stack: m

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 12 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Frame Stack: g Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 13 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 14 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Execution Frame Stack: h

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 15 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Frame Stack: f Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 16 Η Στοίβα (stack) f() { g() + h(); } g() { m(q()); } main() { f(); } Frame Stack: main Execution

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 17 Το Δέντρο Κλήσεων των Συναρτήσεων f() { g() + h(); } g() { m(q()); } main() { f(); } main f h mq g Calls Returns

ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (2/2)

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 19 Γενική Ιδέα Αναδρομής Γιατί σπάμε το πρόγραμμα σε συναρτήσεις; – Κάθε συνάρτηση λύνει ένα «μικρότερο» (υπό)πρόβλημα – Συνδυάζουμε τα μικρότερα προβλήματα με τέτοιο τρόπο που να λύσουμε το συνολικό πρόβλημα – Παράδειγμα: Φτιάξτε ένα πρόγραμμα που να διαχειρίζεται μια βάση δεδομένων με φοιτητές Συναρτήσεις – Για διαχείριση της εισόδου του χρήστη, τι θέλει να κάνει – Για εισαγωγή/διαγραφή/αλλαγή/αναζήτηση στοιχείων – Για εκτύπωση της βάσης δεδομένων – κτλ

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 20 Γενική Ιδέα Αναδρομής Αναδρομική Συνάρτηση είναι μια συνάρτηση που έμμεσα ή άμεσα καλεί τον εαυτό της – Κάθε (κλήση) συνάρτησης λύνει ένα «μικρότερο» (υπό)πρόβλημα του ίδιου τύπου. – Συνδυάζουμε τα μικρότερα προβλήματα με τέτοιο τρόπο που να λύσουμε το συνολικό πρόβλημα – Κάποια στιγμή πρέπει να λύσουμε τα «πολύ μικρά προβλήματα» απευθείας Σε τι μας βοηθάνε οι αναδρομικές συναρτήσεις – Ο κώδικας γίνεται συνήθως πολύ πιο απλός και μπορούμε να λύσουμε πολύ εύκολα προβλήματα που θα φαινόταν πολύ δύσκολα με επανάληψη – Το μέγεθος (γραμμές κώδικα) της συνάρτησης συνήθως «ελαχιστοποιείται»

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 21 Παράδειγμα: Sierpinski Sieve “The Sierpinski sieve is a fractal described by Sierpinski in 1915 and appearing in Italian art from the 13th century” MathWorldfractal Φτιάξτε ένα πρόγραμμα που να παράγει το παρακάτω σχήμα:

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 22 Sierpinski Sieve: Αναδρομική Λύση Ξεκίνα από ένα μαύρο τρίγωνο Τ1 «Αφαίρεσε» το τρίγωνο που σχηματίζεται από τις τρεις μέσους των ακμών Επανέλαβε την ίδια διαδικασία στα τρία (υπο)τρίγωνα που σχηματίζονται, ας τα ονομάσουμε Τ 1,1, Τ 1, 2, Τ 1, 3 Επανέλαβε αναδρομικά την διαδικασία από το βήμα 2

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 23 (Άμεση) Αναδρομή Τα τρία βασικά συστατικά της αναδρομής Για να λύσουμε ένα πρόβλημα μεγέθους n 1. Η βασική περίπτωση(περιπτώσεις) (base-case): Όταν το n είναι αρκετά μικρό δίνουμε μια άμεση (χωρίς άλλη αναδρομή) λύση του «μικρότερου» προβλήματος 2. Αναδρομική κλήση: σπάσε το πρόβλημα σε «μικρότερα» ίδια προβλήματα και λύσε τα με αναδρομική κλήση (κλήση στην ίδια) συνάρτηση 3. Συγχώνευση: συνδύασε τις λύσεις των μικρότερων προβλημάτων, για να λύσεις το πρόβλημα μεγέθους n Το 3ο βήμα δεν είναι απαραίτητο Το «μέγεθος» του προβλήματος μπορεί να είναι το μέγεθος ενός ορίσματος, το μέγεθος ενός πίνακα, το μέγεθος μιας δομής (π.χ., γράφος), κτλ

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 24 Στοίβα και Αναδρομή Σε αναδρομικές συναρτήσεις η στοίβα μπορεί να περιέχει περισσότερα από ένα stack frames της ίδιας συνάρτησης Η αναδρομή απλουστεύει το γράψιμο του κώδικα αλλά η κλήση συνάρτησης κοστίζει Κάθε αναδρομική συνάρτηση μπορεί να υλοποιηθεί και επαναληπτικά (χωρίς αναδρομή) με χρήση στοίβας

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 25 Παράδειγμα 1 int power(int x, int n) { if (n == 0) return 1; else return (x * power(x, n-1)); } Βασική Περί π τωση : το μικρότερο π ρόβλημα, άμεση λύση Λύσε αναδρομικά ένα μικρότερο π ρόβλημα Συγχώνευση λύσεων μικρότερων π ροβλημάτων Το « μέγεθος / δυσκολία » του π ροβλήματος καθορίζεται α π ό τον εκθέτη

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 26 Παράδειγμα 1: Επαναληπτική Λύση int power( int x, int n) { int i = 1; int result = 1; /* check for n >= 0 */ for ( i = 1; i <= n; i++) { result *= x; } return result; }

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 27 Παράδειγμα 2 int factorial( int n) { if ( n <= 1) return 1; else return n*factorial(n-1); } ΠΡΟΣΟΧΗ: η power και factorial δεν ενδείκνυνται για αναδρομική υλοποίηση, παρουσιάζονται μόνο ως παραδείγματα (γιατι;).

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 28 The Fibonacci example

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 29 Ακολουθία Fibonacci Κάθε αριθμός είναι άθροισμα των δύο προηγούμενων του! Δηλαδή f(n)=f(n-1)+f(n-2) Αρκεί αυτό; f(1)=1, f(0)=0, f(n) ορίζεται για n≥0

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 30 Binary Search – Υλοποίηση με επανάληψη int binaryLoopSearch(int p[], int searchkey, int low, int high) { int middle; while ( low <= high ) { middle = (low + high ) / 2; if (searchkey == p[middle]) return middle; else if (searchkey < p[middle] ) high = middle – 1; else low = middle + 1; } return -1; }

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 31 Binary Search – Υλοποίηση με αναδρομή int binarySearch(int p[], int searchkey, int low, int high) { int middle; middle = (low + high ) / 2; if (high < low) return -1; if (searchkey == p[middle]) return middle; else if (searchkey < p[middle]) return binarySearch(p, searchkey, low, middle-1); else return binarySearch(p, searchkey, middle+1,high); return -1; }

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 32 Ακολουθία Fibonacci f( 3 ) f( 1 ) f( 2 ) f( 1 )f( 0 )return 1 return 0 return + + Κάθε αριθμός είναι άθροισμα των δύο προηγούμενων του! Δηλαδή f(n)=f(n-1)+f(n-2)

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 33 The Fibonacci example Figure from I. Oikonomides MSc

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 34 Ακολουθία Fibonacci 1/* Fig. 5.15: fig05_15.c 2 Recursive fibonacci function */ 3#include 4 5long fibonacci( long ); 6 7int main() 8{8{ 9 long result, number; printf( "Enter an integer: " ); 12 scanf( "%ld", &number ); 13 result = fibonacci( number ); 14 printf( "Fibonacci( %ld ) = %ld\n", number, result ); 15 return 0; 16} 17 18/* Recursive definition of function fibonacci */ 19long fibonacci( long n ) 20{ 21 if ( n == 0 || n == 1 ) 22 return n; 23 else 24 return fibonacci( n - 1 ) + fibonacci( n - 2 ); 25}

ΗΥ150 – Προγραμματισμός Ξενοφών Ζαμπούλης 35 Άλλα παραδείγματα Πως θα λύναμε αναδρομικά – Υπολογισμός συναρτήσεων που δίδονται από αναδρομική σχέση, λ.χ. Fibonacci – Αναζήτηση – Ταξινόμηση – Βρες την έξοδο από τον λαβύρινθο – Balance – Φτιάξε ένα fractal δέντρο