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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

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

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

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

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

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

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

Αναδρομικοί Αλγόριθμοι

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

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

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

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Προγραμματισμός Υπολογιστών με C++

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

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

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

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

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

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

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

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

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

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

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

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

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

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

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

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

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

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

Προγραμματιστικές Τεχνικές

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

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

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

Μάθημα 22: Δυαδικά δέντρα (Binary Trees)

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

Προγραµµατισµός. Επιπλέον στοιχεία της C

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

Φροντιςτήριο. Linked-List

Πληροφορική 2. Αλγόριθμοι

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

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

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

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

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

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

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

Προγραμματισμός Υπολογιστών με C++

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

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

Κλάσεις και αντικείμενα #include <iostream.h<

Προγραμματισμός Δομές Δεδομένων

Δομές Επανάληψης. Εισαγωγή στη C++

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Διάλεξη 22η: Επιπλέον στοιχεία της C

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

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

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

Οντοκεντρικός Προγραμματισμός

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

Εργαστήριο 5. Εαρινό Εξάμηνο

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

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

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

Μεταγλωττιστές Βελτιστοποίηση

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

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

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

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

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

Transcript:

Αναδρομή

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

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

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

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f();

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f 8

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g q

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g q

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g m

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f g

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f h

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main f

Η Στοίβα (stack) f() g() + h(); g() m(q()); main() f(); Execution main

Το Δέντρο Κλήσεων των Συναρτήσεων f() g() + h(); g() m(q()); main() f(); Calls Returns f g q main m h

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

Παράδειγμα: παραγοντικό (factorial) f(n) = n! f ( n) n f 1 ( n 1) if n else 0 n! = 1 2 3 (n-1) n Ο κώδικας στις γλώσσες συναρτησιακού προγραμματισμού είναι πολύ παρόμοιος int Factorial(int n) if (n == 0) return 1; else return n * Factorial(n- 1); // base case // recursive case

Αναδρομή Παρακολούθηση αναδρομής trace call recursivefactorial ( 4 ) return 4 * 6 = 24 final answer call return 3 * 2 = 6 recursivefactorial ( 3 ) call return 2 * 1 = 2 recursivefactorial ( 2 ) call return 1 * 1 = 1 recursivefactorial ( 1 ) call return 1 recursivefactorial ( 0 )

Παράδειγμα int factorial( int n) if ( n <= 1) return 1; else return n*factorial(n-1);

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

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

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

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

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

Παράδειγμα 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;

«Γραμμική» Αναδρομή Συνθήκες βάσης (base cases). Εύρεση συνθηκών βάσης (τουλάχιστο μια). Κάθε «αλυσίδα» κλήσεων πρέπει τελικά να φτάσει σε μια συνθήκη βάσης. Μια αναδρομική κλήση Μπορεί να είναι απόφαση μεταξύ πολλών αλλά σε κάθε εκτέλεση συνάρτησης γίνεται μια αναδρομή Κάθε κλήση προχωρά προς μια συνθήκη βάσης πλησιάζοντας προς τη λύση

Algorithm LinearSum(A, n): Είσοδος: Πίνακας ακεραίων με τουλάχιστο 1 στοιχείο Έξοδος Το άθροισμα των στοιχείων if n = 1 return A[0]; else return LinearSum(A, n - 1) + A[n - 1] recursion trace: call return 15 + A [ 4 ] = 15 + 5 = 20 LinearSum ( A, 5 ) call return 13 + A [ 3 ] = 13 + 2 = 15 LinearSum ( A, 4 ) call return 7 + A [ 2 ] = 7 + 6 = 13 LinearSum ( A, 3 ) call return 4 + A [ 1 ] = 4 + 3 = 7 LinearSum ( A, 2 ) call return A [ 0 ] = 4 LinearSum ( A, 1 )

Algorithm ReverseArray(A, i, j): Είσοδος : Πίνακας A και ακέραιοι, θετικοί δείκτες i και j Έξοδος : Η αναστροφή του πίνακα Α από i εώς j if i < j then Swap A[i] and A[ j] ReverseArray(A, i + 1, j - 1) return

Ορίσματα αναδρομής Κατάλληλος σχεδιασμός παραμέτρων συνάρτησης για αναδρομή Μερικές φορές χρειάζονται επιπρόσθετοι παράμετροι Π.χ. φτιάξαμε την ReverseArray(A, i, j), και όχι την ReverseArray(A).

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

ΠΡΟΣΟΧΗ: η power και factorial δεν ενδείκνυνται για αναδρομική υλοποίηση, παρουσιάζονται μόνο ως παραδείγματα (γιατι;).

The Fibonacci example

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

int fib(int k) // Base Cases: // If k == 0 then fib(k) = 0. // If k == 1 then fib(k) = 1. if (k < 2) return k; // Recursive Case: // If k >= 2 then fib(k) = fib(k-1) + fib(k-2). else return fib(k-1) + fib(k-2);

Ακολουθία 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

The Fibonacci example

Πως μπορεί να γίνει επαναληπτικά;

1 /* Fig. 5.15: fig05_15.c 2 Recursive fibonacci function */ 3 #include <iostream.h> 4 using namespace std; f 5 int fibonacci( int ); 6 7 int main() 8 9 int result, number; 10 11 cout << "Enter an integer: " ; 12 cin >> number ; 13 result = fibonacci( number ); 14 cout << "Fibonacci <<number = << result << endl; 15 return 0; 16 17 18 /* Recursive definition of function fibonacci */ 19 int fibonacci( int n ) 20 21 if ( n == 0 n == 1 ) 22 return n; 23 else 24 return fibonacci( n - 1 ) + fibonacci( n - 2 ); 25 41

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;

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;

Άλλα παραδείγματα Πως θα λύναμε αναδρομικά Αναζήτηση Ταξινόμηση Διαχείριση λιστών/δέντρων κτλ Βρες την έξοδο από τον λαβύρινθο Balance Καρκινικές γραφές Φτιάξε ένα fractal δέντρο Fractals

Binary trees

Binary trees O(log N) < O(N) Binary search trees: O(log N) search and insert struct tree_node tree_node *left; tree_node *right; int data; ;

Print binary search tree void print_inorder(tree_node *p) if (p!= NULL) print_inorder(p->left); printf( %d,p->data); print_inorder(p->right);

Delete tree void deleteword(struct wordtree **node) struct wordtree *temp = NULL; if (node!= NULL) if(*node!= '\0') if((*node)->right!= NULL) temp = *node; deleteword(&temp->right); if((*node)->left!= NULL) temp = *node; deleteword(&temp->left); if((*node)->word!= NULL) free((*node)->word); if((*node)->firstline!= NULL) deletelist((*node)->firstline); free(*node); *node = NULL;

C code for the sum_list program int sum_list(struct list_node *l) if(l == NULL) return 0; return l->data + sum_list(l->next);

void free_list(struct list_node *l) struct list node *tmp; if(l == NULL) return 0; tmp = l->next; free(l); free_list(tmp);