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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

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

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

Διαίρει-και-Βασίλευε. Διαίρει-και-Βασίλευε. MergeSort. MergeSort. Πρόβλημα Ταξινόμησης: Είσοδος : ακολουθία n αριθμών (α 1

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

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

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

Πολυπλοκότητα Αλγορίθµων

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

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Διαίρει-και-Βασίλευε. Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Διαίρει-και-Βασίλευε 2

Εργαστήριο 1. Βαθμός ΑΜ Εργ1.2 Σχόλια Εργ1.3 Σχόλια (20)

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

ΕΠΛ232: Εργαστήριο 2

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

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

ιαίρει-και-βασίλευε ημήτρης Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο

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

for for for for( . */

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

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

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

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Θεωρία Υπολογισµού Theory of Computation

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

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

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

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

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

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

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

ΣΥΝΑΡΤΗΣΕΙΣ Παραδείγματα χρήσης συναρτήσεων

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

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

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

Διάλεξη 04: Παραδείγματα Ανάλυσης

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

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

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

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

Quicksort [Hoare, 62] Αλγόριθµοι & Πολυπλοκότητα (Χειµώνας 2011) Quicksort 1

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

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

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

Ανάλυση αλγορίθμων. Χρόνος εκτέλεσης: Αναμενόμενη περίπτωση. - απαιτεί γνώση της κατανομής εισόδου

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

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

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

Βασικές Έννοιες Δοµών Δεδοµένων

Εισαγωγή στους Αλγόριθµους. Αλγόριθµοι. Ιστορικά Στοιχεία. Ο πρώτος Αλγόριθµος. Παραδείγµατα Αλγορίθµων. Τι είναι Αλγόριθµος

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ ΕΠΛ 035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. και Μηχ. Υπολ.

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

IMPLICIT NONE INTEGER :: a, b, c

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

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

Εισαγωγή στην Ανάλυση Αλγορίθμων (2-3)

scanf() scanf() stdin scanf() printf() int float double %lf float

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

Αναδρομικές Σχέσεις «ιαίρει-και-βασίλευε»

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

Κεφάλαιο 10. Ερωτήσεις ανάπτυξης

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

ΠΛΗ111. Ανοιξη Μάθηµα 2 ο. Αλγόριθµοι και Αφηρηµένοι Τύποι εδοµένων. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Quicksort. Επιμέλεια διαφανειών: Δ. Φωτάκης Μικροαλλαγές: Α. Παγουρτζής. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

Υπολογιστικά & Διακριτά Μαθηματικά

ιαφάνειες παρουσίασης #7

Κεφάλαιο 10 Υποπρογράμματα. Καραμαούνας Πολύκαρπος

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

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

Quicksort. ημήτρης Φωτάκης. Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών. Εθνικό Μετσόβιο Πολυτεχνείο

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Initialize each person to be free. while (some man is free and hasn't proposed to every woman) { Choose such a man m w = 1 st woman on m's list to

(Γραμμικές) Αναδρομικές Σχέσεις

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

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

(Γραμμικές) Αναδρομικές Σχέσεις

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

Εισαγωγή στους Αλγορίθμους Ενότητα 11η

(Γραμμικές) Αναδρομικές Σχέσεις

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

Α Ν Α Λ Τ Η Α Λ Γ Ο Ρ Ι Θ Μ Ω Ν Κ Ε Υ Α Λ Α Ι Ο 5. Πως υπολογίζεται ο χρόνος εκτέλεσης ενός αλγορίθμου;

Επαναληπτικές μέθοδοι

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

Transcript:

Αναδροµή (Recursion) Πώς να λύσουµε ένα πρόβληµα κάνοντας λίγη δουλειά και ανάγοντας το υπόλοιπο να λυθεί µε τον ίδιο τρόπο. Πού χρειάζεται; Πολλές µαθηµατικές συναρτήσεις ορίζονται αναδροµικά. εν είναι προφανές πώς µπορούν να οριστούν αλλιώς. Πολλά προβλήµατα λύνονται εύκολα αναδροµικά και δύσκολα µη αναδροµικά Τρίγωνο Sierpinski Μη αναδροµικός ορισµός; ύο παρεξηγήσεις «Είναι δύσκολο να κατανοηθεί» Όχι, απλά απαιτείται εξάσκηση «εν είναι αποδοτική (χάσιµο χρόνου, χώρου)» Κριτήριο η ευκολία για τον άνθρωπο, όχι την µηχανή. Η αποδοτικότητα εξαρτάται από την επιλογή αλγορίθµου (καλή και κακή χρήση αναδροµικότητας). Θα δούµε δύο παραδείγµατα. Σκέψου Αναδροµικά Χωρίζουµε τη λύση σε τρία µέρη i. Κάνε κάποια δουλειά προς την λύση ii. Χρησιµοποίησε την µέθοδο για ένα (ή περισσότερα) µικρότερα υπο-προβλήµατα σε ένα (ή περισσότερα) υποσύνολο δεδοµένων iii. Ένωσε το i) και ii) Πρέπει να περιλαµβάνει µια τετριµµένη περίπτωση για το i), που να µην απαιτείται η ii) ώστε να σταµατάει η αναδροµικότητα 1

Παράδειγµα: Παραγοντικό Αναδροµικός Ορισµός του n!, n>=0 0! = 1 n! = n * (n-1)! Αναδροµικός Ορισµός Υποπρογράµµατος «Λίγη δουλειά»: ένας πολλαπλασιασµός και µια αφαίρεση Βήµα ιακοπής (stopping case) το 0! -«Υποπρόβληµα»: Αναδροµικό Βήµα (recursive step) (n-1)! -Ενώνουµε τα δύο Αναδροµικός Υπολογισµός του 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1* 0! 0! = 1 Χρησιµοποιώντας την τιµή 1 του 0! (βήµα διακοπής) είναι δυνατός ο υπολογισµός του 3! επιστρέφοντας στον υπολογισµό του 1!, του 2! και τέλος του 3! όπως φαίνεται στο παρακάτω σχήµα 3! = 3 * 2! = 3 * 2 = 6 2! = 2 * 1! = 2 * 1 = 2 1! = 1 * 0! = 1 * 1 = 1 0! = 1 Βήµα ιακοπής Ο αναδροµικός αυτός ορισµός µπορεί να υλοποιηθεί εύκολα όπως φαίνεται στο παρακάτω υποπρόγραµµα: long par(int n) long timi; if (n == 0) /* βήµα διακοπής */ timi = 1; else /* αναδροµικό βήµα n! = n * (n-1)!*/ timi = n * par(n - 1); // (Α) return (timi); paragontiko = par(3); 6 To n είναι 3 timi = 3* par(2) Αποτέλεσµα 2 To n είναι 2 timi = 2* par(1) Αποτέλεσµα 1 Παρουσιάζεται ο τρόπος λειτουργίας του αναδροµικού υποπρογράµµατος, όπου κάθε πλαίσιο σχετίζεται µε την εγγραφή ενεργοποίησης (activation record). To n είναι 1 timi = 1* par(0) Αποτέλεσµα 1 To n είναι 0 timi = 1 2

/*κύριο πρόγραµµα*/ Υλοποίηση Αναδροµής x = par(3); /* program address B */ παράµετροι ιεύθυνση ς συνάρτησης 3 η και 4 η κλήσειςτης par(1) και par(0) στην par (A) 0 Α 1 η κλήση της par(3)στο main (B) Τερµατισµός 4 ης κλήσηςτης par(0) στην par (A) Επιστροφή τιµής 0!==1 2 η κλήση της par(2)στην par (A) Επιστροφή ροής προγράµµατος στην διεύθυνση Α Τερµατισµός 3 ης κλήσηςτης par(1) στην par (A) Επιστροφή τιµής 1!==1*0!==1 Επιστροφή ροής προγράµµατος στην διεύθυνση Α Τερµατισµός 2 ης κλήσηςτης par(2) στην par (A) Επιστροφή τιµής 1!==2*1!==2 Επιστροφή ροής προγράµµατος στην διεύθυνση Α 3 Β 6 Β Οπτικοποίηση Χρόνου - Χώρου Συναρτήσεων Χρόνος Κλήσεων, ιάρκεια Εκτέλεσης και Απαιτούµενη µνήµη) Space B Proc A C Main E Τερµατισµός 1 ης κλήσηςτης par(3)στην main (B) Επιστροφή τιµής 3!==3*2!=6 Επιστροφή ροής προγράµµατος στην διεύθυνση B Time 3

Πολυπλοκότητα Ο(?) Παραγοντικού Αναδροµή-Επανάληψη Χρήση αναδροµικών συναρτήσεων Α. Με αναδροµή timi = n * par (n - 1) : υο κύριες πράξεις *, - T Α (n) = 2 + T(n - 1) = 2 + 2 + T(n - 2) = 2 + 2 +... + 2 + T(0) = 2*n+1 T Α (n) = O(n) Β. Με επανάληψη n! = 1*1 * 2 * 3 *... * n, µια κύρια πράξη * T Ε (n) = 1+1+...+1=(n+1)*1=n+1 T Ε (n) = O(n) T Α (n) = T Ε (n) = O(n) Αριθµοί Fibonacci 0 1 1 2 3 5 8 13 21...Fibn = Fibn-1 + Fibn-2 Αναδροµική Υλοποίηση long Fib (long n) long Fibnum; if (n <= 0) Fibnum = 0; else if (n == 1) Fibnum = 1; else Fibnum = Fib (n - 1) + Fib (n - 2); return (Fibnum); Πολυπλοκότητα Αναδροµικής Υλοποίησης Fibnum = Fib (n - 1) + Fib (n - 2); 3 βασικές πράξεις -, +, - Τ(n) = 3 + T(n - 1) + T(n - 2) = 3 + [3 + T(n - 2) + T(n - 3)] + T(n - 2) = 6 + 2Τ(n-2) + Τ(n - 3), για n>=3 T(n) >= 2T(n - 2) >= 2 2 T(n - 4) >=... >= 2 n/2 T(0), αν n άρτιο ή T(n) >= 2T(n - 2) >= 2 2 T(n - 4) >=... >= 2 (n-1)/2 T(1), αν n περιττό Αλλά Τ(0) = Τ(1) = 1, συνεπώς T Α (n) = O(2 n/2 ) για όλα τα n >=2 Αναδροµικές Συναρτήσεις Αναλυτικές Λύσεις (µάθηµα Πολυπλοκότητα) long efib (long n) /* Επαναληπτικό υποπρόγραµµα για τον υπολογισµό του n-ιοστού αριθµού Fibonacci*/ long Fib1, Fib2, Fib3, i; Fib1 = 0; Fib2 = 1; for (i = 3;i<=n;i++) Fib3 = Fib1 + Fib2; Fib1 = Fib2; Fib2 = Fib3; return(fib2); T E =1+1+1+ +1 = 1*(n+1)= n+ 1= O(n) 4

The Ackermann function Η συνάρτηση Ackermann ορίζεται αναδροµικά για µη-αρνητικούς ακέραιους m, n ως εξής Η υλοποίηση απλή long ack(int m, int n) if (m == 0) return (n+1) ; else if (n = =0) return ack(m-1, 1) ; else return ack(m-1, ack(m, n-1)) ;... Αλλά η συµπεριφορά της A(1, 2) = A(0, A(1,1)) = A(0, A(0, A(1,0))) = A(0, A(0, A(0,1))) = A(0, A(0, 2)) = A(0, 3) = 4 A(4, 3) = A(3, A(4, 2)) = A(3, A(3, A(4, 1))) = A(3, A(3, A(3, A(4, 0)))) = A(3, A(3, A(3, A(3, 1)))) = A(3, A(3, A(3, A(2, A(3, 0))))) = A(3, A(3, A(3, A(2, A(2, 1))))) = A(3, A(3, A(3, A(2, A(1, A(2, 0)))))) = A(3, A(3, A(3, A(2, A(1, A(1, 1)))))) = A(3, A(3, A(3, A(2, A(1, A(0, A(1, 0))))))) = A(3, A(3, A(3, A(2, A(1, A(0, A(0, 1))))))) = A(3, A(3, A(3, A(2, A(1, A(0, 2)))))) = A(3, A(3, A(3, A(2, A(1, 3))))) = A(3, A(3, A(3, A(2, A(0, A(1, 2)))))) = A(3, A(3, A(3, A(2, A(0, A(0, A(1, 1))))))) = A(3, A(3, A(3, A(2, A(0, A(0, A(0, A(1, 0)))))))) = A(3, A(3, A(3, A(2, A(0, A(0, A(0, A(0, 1)))))))) = A(3, A(3, A(3, A(2, A(0, A(0, A(0, 2)))))) = A(3, A(3, A(3, A(2, A(0, A(0, 3))))) = A(3, A(3, A(3, A(2, A(0, 4))))) = A(3, A(3, A(3, A(2, 5)))) =... = A(3, A(3, A(3, 13))) =... = A(3, A(3, 65533)) =... A(3, 65533) επιστρέφει 2 65536 3, αριθµός µεγαλύτερος από τον αριθµό των ατόµων σε όλο τον ορατό κόσµο. Κατόπιν, αυτός ο αριθµός χρησιµοποιείται ως δύναµη του 2 για το τελικό αποτέλεσµα. 5

Πιθανές Παγίδες Λάθος συνθήκη τερµατισµού (do while) Ατέρµων Βρόχος Συνεχής Αναδροµή εν γίνεται Έλεγχος τερµατισµού Χρησιµοποιούµε αναδροµή µε µη αποδεκτές παραµέτρους Μη τερµατίζουσα Αναδροµή εν ικανοποιείται η συνθήκη τερµατισµού Κλήση par(-1) ενώ ελέγχουµε (n==0) Συµπτώµατα:συνεχείς κλήσεις έως ότου εξαντληθεί η µνήµη εν αλλάζουν οι παράµετροι της αναδροµής, N=f(N). εν υπάρχει πρόοδος. Αφαίρεση της Γραµµικής Αναδροµής (αναδροµή µε µια µόνο αναδροµική κλήση) Με χρήση Στοίβας void epanaliptiki (long n) typos_stoiva stoiva; dimiourgia(stoiva); void grammiki_anadromi (long n) if (συνθήκη (n)) µη αναδροµική περίπτωση (n); else προηγούµενες πράξεις (n); grammiki_anadromi (F(n)); µετέπειτα πράξεις (n); while (!συνθήκη (n)) προηγούµενες πράξεις (n); othisi (stoiva, n); n = F(n); µη αναδροµική περίπτωση (n); while (!keni(stoiva)) exagogi(stoiva, &n); µετέπειτα πράξεις (n); 6