Προγραµµατισµός. Αναδροµή (1/2)

Σχετικά έγγραφα
Προγραμματισμός Αναδρομή

Προγραμματισμός Αναδρομή

Διάλεξη 15η: Αναδρομή, μέρος 1ο

Αναδροµή (Recursion) ύο παρεξηγήσεις. Σκέψου Αναδροµικά. Τρίγωνο Sierpinski Μη αναδροµικός ορισµός;

Εισαγωγή στον Προγραμματισμό

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναδροµικές Συναρτήσεις Χειµερινό Εξάµηνο 2014

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Αναδρομή (Recursion) Πώς να λύσουμε ένα πρόβλημα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί με τον ίδιο τρόπο.

Αναδρομή Ανάλυση Αλγορίθμων

ΗΥ-150. Ταξινόµηση και Αναζήτηση

Ανάπτυξη και Σχεδίαση Λογισμικού

Διάλεξη 20: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Χαρακτηριστικά αναδροµής

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

Ταξινόµηση και Αναζήτηση

Διάλεξη 5η: Εντολές Επανάληψης

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

Η βασική συνάρτηση προγράμματος main()

Δομημένος Προγραμματισμός

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 17η: Ταξινόμηση και Αναζήτηση

Εργαστηριακή Άσκηση 1

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Ηβασικήσυνάρτηση προγράμματος main()

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 9: Αναδρομή

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. Δείκτες (Διάλεξη 14)

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

Προγραμματισμός Ι (ΗΥ120)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 6 Ο. Συναρτήσεις Τοπικές, καθολικές, στατικές μεταβλητές Μεταβλητές τύπου extern και register Αναδρομή

Εισαγωγή στον δομημένο προγραμματισμό

Η βασική λειτουργία σε όλες αυτές τις συναρτήσεις είναι η εκτύπωση γραµµών.

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Μεθόδων Επίλυσης Προβλημάτων

11/23/2014. Στόχοι. Λογισμικό Υπολογιστή

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Αναδρομή. ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 6. Νίκος Μπέλλας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΠΛ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον Προγραμματισμό (με. τη C)

Κεφάλαιο : Επαναλήψεις (for, do-while)

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομές Δεδομένων & Αλγόριθμοι

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Προγραμματισμός Η/Υ. Ενότητα 7: Συναρτήσεις

Προγραμματισμός Η/Y. Διάλεξη 6 η : Συναρτήσεις

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Εισαγωγή στον Προγραμματισμό

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Δομημένος Προγραμματισμός (ΤΛ1006)

Συναρτήσεις. Εισαγωγή

Κεφάλαιο 3.1, : Συναρτήσεις I. ( ιάλεξη 11) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός ΙI (Θ)

Ενότητα 1: Εισαγωγή Ασκήσεις και Λύσεις

ΜΥΥ105: Εισαγωγή στον Προγραµµατισµό. Αναζήτηση και Ταξινόµηση Χειµερινό Εξάµηνο 2014

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Η πολυνηματική γλώσσα προγραμματισμού Cilk

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Διάλεξη 15: Αναδρομή (Recursion)

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Συναρτήσεις και διαδικασίες

Προγραμματισμός Ι (ΗΥ120)

Η γλώσσα προγραμματισμού C

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Συστημάτων

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δομημένος Προγραμματισμός (ΤΛ1006)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΗΥ-150. Προγραμματισμός

Επανάληψη για τις Τελικές εξετάσεις

Τύποι Δεδομένων Είσοδος/Έξοδος

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

τις αναδρομικές ακολουθίες (recursive sequences) στις οποίες ορίζαμε

Αλγόριθµοι Τύπου Μείωσης Προβλήµατος

Transcript:

Προγραµµατισµός Αναδροµή (1/2) Προγραµµατισµός

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

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

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

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Προγραµµατισµός 5

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main Προγραµµατισµός 6

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f Προγραµµατισµός 7

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g Προγραµµατισµός 8

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g q Προγραµµατισµός 9

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g q Προγραµµατισµός 10

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g m Προγραµµατισµός 11

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g Προγραµµατισµός 12

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f Προγραµµατισµός 13

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f h Προγραµµατισµός 14

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f Προγραµµατισµός 15

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main Προγραµµατισµός 16

Το έντρο Κλήσεων των Συναρτήσεων f() g() + h(); g() m(q()); main() f(); Calls Returns f g q main m h Προγραµµατισµός 17

ΗΥ-150 Προγραµµατισµός Αναδροµή (2/2) Προγραµµατισµός

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

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

Παράδειγµα: Sierpinski Sieve The Sierpinski sieve is a fractal described by Sierpinski in 1915 and appearing in Italian art from the 13th century MathWorld Φτιάξτε ένα πρόγραµµα που να παράγει το παρακάτω σχήµα: Προγραµµατισµός 21

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

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

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

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

Παράδειγµα 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; Προγραµµατισµός 26

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

The Fibonacci example Προγραµµατισµός 28

Ακολουθία Fibonacci Κάθε αριθµός είναι άθροισµα των δύο προηγούµενων του! ηλαδή f(n)=f(n-1)+f(n-2) Αρκεί αυτό; f(1)=1, f(0)=0, f(n) ορίζεται για n 0 Προγραµµατισµός 29

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; Προγραµµατισµός 30

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; Προγραµµατισµός 31

Ακολουθία Fibonacci Κάθε αριθµός είναι άθροισµα των δύο προηγούµενων του! ηλαδή f(n)=f(n-1)+f(n-2) f( 3 ) return f( 2 ) + f( 1 ) return f( 1 ) + f( 0 ) return 1 return 1 return 0 Προγραµµατισµός 32

The Fibonacci example Figure from I. Oikonomides MSc Προγραµµατισµός 33

Ακολουθία Fibonacci 1 /* Fig. 5.15: fig05_15.c 2 Recursive fibonacci function */ 3 #include <stdio.h> 4 5 long fibonacci( long ); 6 7 int main() 8 9 long result, number; 10 11 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 Προγραµµατισµός 34

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