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

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

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

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

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

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

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ

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

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

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

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

Πανεπιστήμιο Πελοποννήσου. Σχολή Θετικών Επιστημών & Τεχνολογίας. Τμήμα Επιστήμης & Τεχνολογίας Υπολογιστών. Προγραμματισμός Ι Εργαστήριο

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

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

for for for for( . */

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

Σχεδίαση και Ανάλυση Αλγορίθμων

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

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

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

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

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

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

Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον (Εργαστήριο 4)

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3

Άπληστοι Αλγόριθµοι (CLR, κεφάλαιο 17)

4. Αναδροµικός τύπος Είναι ο τύπος που συσχετίζει δύο ή περισσότερους γενικούς όρους µιας ακολουθίας

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

Ν!=1*2*3* *(N-1) * N => N! = (Ν-1)! * N έτσι 55! = 54! * 55

Ορισµός. Εστω συναρτήσεις: f : N R και g : N R. η f(n) είναι fi( g(n) ) αν υπάρχουν σταθερές C 1, C 2 και n 0, τέτοιες ώστε:

Ανάλυση Αλγορίθµων. Σύντοµη επανάληψη (ΕΠΛ 035).

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y»

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

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

Διαδικασιακός Προγραμματισμός

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

Στοιχεία Αλγορίθµων και Πολυπλοκότητας

Σχεδίαση & Ανάλυση Αλγορίθμων

Sheet2. - Άσκηση 1 οκ - Άσκηση 2 οκ. Σκέψου πώς θα µπορούσες να την

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

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

Τυχαίοι αριθμοί ρίξε μια «ζαριά»

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

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

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

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

επιστρέφει το αμέσως μεγαλύτερο από το x στοιχείο του S επιστρέφει το αμέσως μικρότερο από το x στοιχείο του S

Εντολές Επανάληψης. int sum = 0, i=1; sum += i++ ; sum += i++ ; Η πράξη αυτή θα πρέπει να επαναληφθεί Ν φορές!

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

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

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Υπολογισμός - Εντολές Επανάληψης

Εισαγωγή στην επιστήμη των Υπολογιστών & Τηλεπικοινωνιών

Αλγόριθµοι και Πολυπλοκότητα

Υπολογισμός αθροισμάτων

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 8ο Αλγόριθμοι

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

Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Σημειωματάριο μαθήματος 1ης Νοε. 2017

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

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

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Sheet1_2. - Δεν απελευθερώνεις τη δυναµικά δεσµευµένη µνήµη. - Η έξοδος του προγράµµατός σου δεν είναι ακριβώς όπως ζητούσε η άσκηση.

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

2 Αποδείξεις. 2.1 Εξαντλητική µέθοδος. Εκδοση 2005/03/22. Υπάρχουν πολλών ειδών αποδείξεις. Εδώ ϑα δούµε τις πιο κοινές:

Πρόβληµα : Πώς θα λύναµε αυτό το πρόβληµα αν είχαµε µόνο χαρτί και µολύβι, και κάποιος µας έλεγε τους αριθµούς προφορικά?

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

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

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

4.3. Γραµµικοί ταξινοµητές

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

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

Σημειώσεις για πρόοδο στο εργαστήριο

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

Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον

Αναδρομή (Recursion) Η Δίδυμη Αδελφή της Επανάληψης. Διαφάνειες από τους Robert Sedgewick και Kevin Wayne Ι-1

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

to post PASS PASS FAIL

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

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

οριακό PASS 402 PASS Πολύ σωστά, µπράβο οριακό PASS

HY118- ιακριτά Μαθηµατικά. Μαθηµατική επαγωγή. 11 Επαγωγή

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 1 ΛΥΣΕΙΣ Ανάλυση Πολυπλοκότητας

Transcript:

Χαρακτηριστικά αναδροµής base case : συνθήκη τερµατισµού της αναδροµής Όταν το πρόβληµα είναι αρκετά µικρό ή απλό ώστε η λύση να είναι άµεση αναδροµικό βήµα : κλήση της ίδιας συνάρτησης για µικρότερη ή πιο απλή µορφή του ίδιου προβλήµατος κατασκευή της τελικής λύσης χρησιµοποιώντας τη λύση της πιο απλής µορφής

Παράδειγµα int factorial (int num) { if (num == 0) { return 0; base case return n * factorial(num-1); κατασκευή λύσης αναδροµικό βήµα

Συµβουλή Εµπιστευόµαστε ότι η αναδροµική κλήση θα λύσει σωστά το "µικρότερο" πρόβληµα Αποφεύγουµε να ακολουθούµε τις αναδροµικές κλήσεις σε βάθος γιατί θα χαθούµε! Αν η εκτέλεση τερµατίσει µε segmentation fault, ελέγχουµε τη συνθήκη τερµατισµού (base case) και τις παραµέτρους στην αναδροµική κλήση Προσέχουµε η συνθήκη τερµατισµού να ελέγχεται πάντα πριν γίνει η αναδροµική κλήση

Άσκηση 1 Υλοποιήστε την αναδροµική συνάρτηση int min (int table[], int start, int end) η οποία επιστέφει το µικρότερο ακέραιο που υπάρχει στον πίνακα table ανάµεσα στις θέσεις start και end (συµπεριλαµβανοµένων). Υποθέστε πώς το start δεν είναι µεγαλύτερο του end, και κανένα από τα δύο δεν είναι εκτός ορίων του πίνακα.

Λύση άσκησης 1 Ποιο είναι ένα πιο απλό/µικρό πρόβληµα? Η εύρεση του µικρότερου στοιχείο ανάµεσα στις θέσεις start+1 και end. Το πρόβληµα είναι µικρότερο γιατί δουλεύουµε σε µικρότερο εύρος. Πώς µπορούµε να βρούµε τη λύση του "µεγάλου" προβλήµατος τώρα? Συγκρίνοντας το στοιχείο στη θέση start µε το αποτέλεσµα του µικρότερου προβλήµατος Πότε σταµατάµε? Πότε είναι το πρόβληµα πολύ µικρό? Όταν το εύρος είναι 1! Με άλλα λόγια όταν start == end

Λύση άσκησης 1 int min (int table[], int start, int end) { int current_min; if (start == end) { return table[start]; current_min = min(table, start+1, end) if (table[start] < current_min) { return table[start]; else { return current_min;

Άσκηση 2 Ο Spiderman θέλει να διανύσει Ν οικοδοµικά τετράγωνα µε τη γνωστή µέθοδο. Γνωρίζοντας ότι µε κάθε εκτόξευση ιστού µπορεί να προχωρήσει είτε κατά ένα είτε κατά δύο τετράγωνα, υπολογίστε µε πόσους διαφορετικούς τρόπους µπορεί να διανύσει τα Ν τετράγωνα.

Άσκηση 2 - τρόπος σκέψης Θέλουµε µια συνάρτηση που να υπολογίζει όλους τους δυνατούς τρόπους να διανύσει ο Spiderman Ν τετράγωνα. Ξεκινώντας, έχει δύο επιλογές: Εκτοξεύει ιστό που διανύει ένα τετράγωνο. Σε αυτή την περίπτωση, η απάντηση του προβλήµατος είναι όσο όλοι οι δυνατοί τρόποι να διασχίσει Ν-1 τετράγωνα Εκτοξεύει ιστό που διανύει δύο τετράγωνα. Σε αυτή την περίπτωση, η απάντηση του προβλήµατος είναι όσο όλοι οι δυνατοί τρόποι να διασχίσει Ν-2 τετράγωνα Άρα, συνολικά, όλοι οι δυνατοί τρόποι είναι το άθροισµα των δύο παραπάνω λύσεων!

Άσκηση 2 - τρόπος σκέψης Προηγουµένως βρήκαµε το αναδροµικό βήµα. Τώρα πρέπει να σκεφτούµε το base case Έχουµε δύο "απλούστερες" περιπτώσεις: Υπάρχει µόνο ένα τετράγωνο. Σε αυτή την περίπτωση υπάρχει µόνο ένας τρόπος να το διανύσει ο Spiderman Υπάρχουν δύο τετράγωνα Σε αυτή την περίπτωση υπάρχουν δύο τρόποι να τα διανύσει. Είτε µε µια εκτόξευση που "πιάνει" δύο τετράγωνα,, είτε µε δύο εκτοξεύσεις που "πιάνουν" από ένα τετράγωνο η κάθε µια

Άσκηση 2 - µαθηµατική περιγραφή Αν θέλουµε να εκφράσουµε τη λύση µε µαθηµατικό τρόπο: f(ν) είναι η συνάρτηση που υπολογίζει το πλήθος των τρόπων να διανύσει ο Spiderman Ν τετράγωνα. f (N) = f(n-1) + f(n-2) f(1) = 1 f(2) = 2

Άσκηση 2 - σε C int travel (int blocks) { if (blocks == 1) return 1; if (blocks == 2) return 2; return ( travel(blocks-1) + travel(blocks-2));

Άσκηση 2 - εναλλακτικά Άραγε λύνεται και µε επανάληψη το πρόβληµα? ΝΑΙ! ΟΛΑ τα προβλήµατα που λύνονται αναδροµικά, µπορούν να λυθούν και επαναληπτικά. Για παράδειγµα, δείτε αυτή την επαναληπτική λύση για το Towers of Hanoi: for (x=1; x < (1 << disks); x++) { printf( "move from tower %d to tower %d.\n", (x&x-1)%3, ((x x-1)+1)%3 );

Άσκηση 2 - λύση µε επανάληψη int travel (int blocks) { int way1, way2, i, steps; way1 = 1; way2 = 2; for (i=3; i<=blocks; i++) { steps = way1+way2; way1 = way2; way2 = steps; if (blocks == 1) return way1; else return way2;

Άσκηση 3 Μια εναλλακτική υλοποίηση της συνάρτησης υπολογισµού παραγοντικού: int factorial (int num, int result) { if (num == 0) { return result; return factorial(num-1, num*result); με αρχική κλήση: factorial(n, 1);

Άσκηση 3 - πώς δουλεύει? factorial(4, 1) factorial(3, 4*1) factorial(2, 3*4*1) factorial(1, 2*3*4*1) factorial(0, 1*2*3*4*1) επιστρέφει 1*2*3*4*1 Είναι αυτό γνήσια αναδροµή? Έχει αναδροµικό βήµα? ΝΑΙ Έχει συνθήκη τερµατισµού? ΝΑΙ Κατασκευάζει το αποτέλεσµα από την πιο απλή λύση? ΟΧΙ!

Άσκηση 3 - τι συµβαίνει? Αυτό είναι ένα παράδειγµα tail recursion (αναδροµή ουράς?) Το αποτέλεσµα της συνάρτησης είναι ακριβώς ίδιο µε το αποτέλεσµα που µας επιστρέφει η αναδροµική κλήση. Επειδή η αναδροµική κλήση είναι η τελευταία εντολή στη συνάρτηση (η ουρά), ονοµάζουµε αυτή την αναδροµή tail recursion Η tail recursion ΔΕΝ είναι γνήσια αναδροµή - είναι ισοδύναµη µε επανάληψη και πολλοί compilers την αντικαθιστούν µε επανάληψη όταν κατασκευάζουν κώδικα assembly.

Από tail recursion σε επανάληψη - βήµα1 int factorial (int num, int result) { if (num == 0) return result; return factorial(num-1, num*result); int factorial (int num, int result) { start: if (num == 0) return result; result = num*result; num = num-1; goto start;

Από tail recursion σε επανάληψη - βήµα2 int factorial (int num, int result) { start: if (num == 0) return result; result = num*result; num = num-1; goto start; int factorial (int num, int result) { while (num!= 0) { result = num*result; num = num-1; return result;

Tail Recursion Αν η λύση που σκεφτήκατε για ένα πρόβληµα χρησιµοποιεί tail recursion, τότε αντικαταστήστε τη µε επανάληψη - είναι πιο αποτελεσµατική Αν σας ζητούν να λύσετε ένα πρόβληµα αναδροµικά, τότε ΜΗΝ το λύσετε µε tail recursion. Δε θεωρείται αναδροµική µια τέτοια λύση.