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

Σχετικά έγγραφα
Διάλεξη 15: Αναδρομή (Recursion)

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

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

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

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

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

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

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

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Δομές Δεδομένων (Data Structures)

Α Ν Α Δ Ρ Ο Μ Η (R e c u r s i o n) Παναγιώτης Σφέτσος, PhD

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

API: Applications Programming Interface

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Συλλογές, Στοίβες και Ουρές

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 29/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

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

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

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

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 10/1/08

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα μέσα σε αντικείμενα Αντικείμενα ως επιστρεφόμενες τιμές Αντικείμενα με πίνακες

ΕΠΛ131 Αρχές Προγραμματισμού

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

POINTERS, AGGREGATION, COMPOSITION

8. Μέθοδοι (Methods)

8. Σωροί (Heaps)-Αναδρομή- Προχωρημένη Ταξινόμηση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Βασικές Δομές Δεδομένων

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 13/12/07

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

Transcript:

1 Διάλεξη 15: Αναδρομή (Recursion) Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Η έννοια της αναδρομής - Μη-αναδρομικός / Αναδρομικός Ορισμός Συναρτήσεων - Παραδείγματα Ανάδρομης - Αφαίρεση της Αναδρομής

Μη αναδρομικές συναρτήσεις Προτού δούμε τι είναι αναδρομή θεωρήστε το πρόβλημα εύρεσης του παραγοντικού κάποιου αριθμού (factorial). 0! = 1, 1! = 1 2! = 1x2 = 2 3! = 1x2x3 = 6 4! = 1x2x3x4=24 5! = 1x2x3x4x5 = 120 Ζητούμενο: Na υλοποιήσουμε την factorial(int n) η οποία μας επιστρέφει το παραγοντικό κάποιου θετικού ακεραίου n. Λύση int factorial(int n) { int i, result=1; for (i=1; i<=n; i++) { result *= i; return result; 2

Αναδρομή Βασική έννοια στα Μαθηματικά και στην Πληροφορική. Στην πληροφορική η αναδρομή χρησιμοποιείται σαν τεχνική προγραμματισμού και σαν μέθοδος σχεδιασμού αλγορίθμων. Στον προγραμματισμό η αναδρομή εμφανίζεται με την κλήση ενός υποπρογράμματος από τον εαυτό του. Ένα αναδρομικό υποπρόγραμμα αποτελείται από: ένα βήμα τερματισμού, όπου ορίζεται η εκτέλεση του υποπρογράμματος για κάποιες μικρές τιμές των παραμέτρων του, και ένα αναδρομικό βήμα, κατά το οποίο η εκτέλεση του υποπρογράμματος ορίζεται ως συνδυασμός κλήσεων του υποπρογράμματος σε άλλες μικρότερες τιμές των παραμέτρων. 3

Παράδειγμα 1: Παραγοντικός Αριθμός με Αναδρομή Ας ορίσουμε τώρα τον αναδρομικό ορισμό της factorial. 0! = 1, 1! = 1 2! = 1x2 = 2 3! = 1x2x3 = 6 4! = 1x2x3x4=24 5! = 1x2x3x4x5 = 120 Ας ορίσουμε τώρα τον αναδρομικό ορισμό της factorial. Αναδρομικός Ορισμός συνάρτησης <factorial> Βήμα Τερματισμού: 0! = 1 Αναδρομικό Βήμα: n! = n x (n-1)! 4

Παραγοντικός Αριθμός με Αναδρομή int factorial ( int n ) { if (n == 0) return 1; else Βήμα Τερματισμού return n x factorial(n-1); Αναδρομικό Βήμα 6 2 Εκτέλεση factorial(3) 1 Εκτέλεση factorial(2) return 2 return 3 factorial(2); Εκτέλεση factorial(0) return 1 1 Εκτέλεση factorial(1) return 1 factorial(0); factorial(1); 5

Υλοποίηση αναδρομής Σε κάθε κλήση οποιασδήποτε συνάρτησης ένα σύνολο από λέξεις (stack frame) φυλάσσεται σε μια στοίβα (την στοίβα του προγράμματος), από όπου μπορεί να ανασυρθεί. Όταν μια συνάρτηση διακόψει την εκτέλεσή της με την κλήση μιας άλλης συνάρτησης οι παράμετροι της συνάρτησης, η διεύθυνση επιστροφής και οι τοπικές μεταβλητές της καλούσας συνάρτησης φυλάσσονται μέσα στη στοίβα του προγράμματος. Έτσι όταν η κληθείσα συνάρτηση τερματίσει το περιβάλλον την καλούσας συνάρτησης ανασύρεται από τη στοίβα για να συνεχιστεί κανονικά η εκτέλεσή της. Αφού κάθε κλήση μιας διαδικασίας εκτελείται στο δικό της περιβάλλον, είναι επιτρεπτή και η κλήση συναρτήσεων από τον εαυτό τους (αναδρομή). 6

Stack and Heap (Στοίβα και Σωρός) 7

Stack and Heap (Στοίβα και Σωρός) 8 Image from: https://www.codeproject.com/articles/76153/six-important-net-concepts- Stack-heap-value-types#Stack%20and%20Heap

Call Stack 9 Image from: https://en.wikipedia.org/wiki/call_stack

10 Αναδρομή και Διαχείριση Μνήμης factorial(2) Στοίβα main factorial(2) return 2 * factorial(1) factorial( 2 ) main factorial(2) return 2 * factorial(1) return 1 * factorial(0) factorial( 1 ) factorial( 2 ) main

Αναδρομή και Διαχείριση Μνήμης 11 factorial(2) return 2 * factorial(1) return 1 * factorial(0) return 1 factorial( 0 ) factorial( 1 ) factorial( 2 ) main factorial(2) return 2 * factorial(1) return 1 * 1 factorial( 1 ) factorial( 2 ) main

12 Αναδρομή και Διαχείριση Μνήμης factorial(2) return 2 * 1 factorial( 2 ) main 2 Στοίβα main

13 Παράδειγμα 2: Δύναμη Αριθμού με Αναδρομή 2) Δύναμη (Power) a 0 = 1 a n = a n-1.a (n>=1) int mpower(int a, int n) { if (n==0) return 1; return a*mpower(a, n-1); Παράδειγμα mpower(2,3) => 2*mpower(2,2) = 2*2*mpower(2,1) = 2*2*2*mpower(2,0) = 2*2*2*1= 8

Παράδειγμα 3: Fibonacci Numbers 3) Αριθμοί Fibonacci (Leonardo of Pisa 1202μΧ) Χρησιμοποιήθηκαν για να εκφράσουν την αύξηση κουνελιών! Σε ιδανικές συνθήκες! Στον μήνα 0 έχουμε 0 ζεύγη, και στον μήνα 1 έχουμε 1 Το ζεύγος γονιμοποιείται μετά τον πρώτο μήνα (δηλ. στον δεύτερο). Κάθε μήνα, κάθε ζεύγος παράγει ένα νέο ζεύγος Έστω ότι είμαστε στον μήνα n και έχουμε ένα πληθυσμό F(n) ζευγών. Αυτή την στιγμή μόνο κουνέλια που ήταν ζωντανά την στιγμή n-2 παράγουν ένα νέο ζεύγος. Επομένως F(n-2) ζευγάρια προστίθεται στον παρόν πληθυσμό των F(n-1). Ο ολικός πληθυσμός την στιγμή F(n) είναι επομένως F(n) = F(n-1) + F(n-2) 14 0,1,1,2,3,5,8,13,21,34,55,89,.

Κουνέλια a la Fibonacci 15 Image from: http://oldeuropeanculture.blogspot.com/2018/02/fibonacci_24.html

Golden Ratio, Golden Spiral and Fibonacci 16 F n F n 1 φ ttp://oldeuropeanculture.blogspot.com/2018/02/fibonacci_24.html Fibonacci Spiral Golden Spiral https://commons.wikimedia.org/wiki/file:fakereallogspiral.png

17 Παράδειγμα 3: Fibonacci Numbers (συν.) Μαθηματικός Ορισμός Κώδικας 1 int fibonacci(int n) { if (n==0) return 0; else if (n==1) return 1; else return Κώδικας 2 int fibonacci(int n) { 0 n = 0 F n = F n = ቐ 1 n = 1 F n 1 + F(n 2) n > 1 fibonacci(a-1) + fibonacci(a-2); return (n<=1)? n : Fibonacci(n-1) + Fibonacci(n-2);

18 Παράδειγμα 4: Παλίνδρομα 4) Παλίνδρομα (Palindrome) abac false abba true aba true boolean ispalindrome (String s) { if (s.length()<=1) return true; else if ( s.charat(0)!=s.charat(s.length()-1) ) return false; else return ispalindrome( s.substring(1, s.length()-1) );

Παράδειγμα 4: Παλίνδρομα (συν.) Η προηγούμενη μέθοδος παρουσιάζει πρόβλημα αποδοτικότητας διότι δημιουργεί ένα καινούριο String κάθε φορά που καλείται αναδρομικά return ispalindrome( s.substring(1, s.length()-1) ); 19 Μερικές φορές είναι καλύτερα να χρησιμοποιηθεί μία βοηθητική συνάρτηση για να αποφύγουμε τέτοια προβλήματα boolean ispalindrome (String s) { return ispalindrome(s, 0, s.length()-1); boolean ispalindrome (String s, int low, int high) { if (high<=low) return true; else if ( s.charat(low)!=s.charat(high) ) else return false; return ispalindrome(s, low+1, high-1 ); Υπερφόρτωση (Overloading)

20 Παράδειγμα 5: Μέγεθος Φακέλου (Directory Size) import java.io.file; import java.util.scanner; public class DirectorySize { public static void main(string[] args) { // Prompt the user to enter a directory or a file System.out.print("Enter a directory or a file: "); Scanner input = new Scanner(System.in); String directory = input.nextline(); // Display the size System.out.println(getSize(new File(directory)) + " bytes"); public static long getsize(file file) { long size = 0; // Store the total size of all files if (file.isdirectory()) { File[] files = file.listfiles(); // All files and subdirectories for (int i = 0; i < files.length; i++) { size += getsize(files[i]); // Recursive call else { // Base case size += file.length(); return size;

Παράδειγμα 6: Πύργοι του Hanoi Υπάρχουν n δίσκοι με αριθμούς 1, 2, 3,..., n, και τρεις πύργοι με ονόματα A, B, και C. Κανένας δίσκος δεν μπορεί να είναι πάνω σε μικρότερο δίσκο ανά πάσα στιγμή. Αρχικά, όλοι οι δίσκοι τοποθετούνται στον πύργο A. Μόνο ένας δίσκος μπορεί να μετακινηθεί ανά πάσα στιγμή και πρέπει να είναι ο πιο ψηλός δίσκος σε ένα πύργο 21

22 Παράδειγμα 6: Πύργοι του Hanoi (συν.) Το πρόβλημα των πύργων του Hanoi μπορεί να διασπαστεί σε 3 υπο-προβλήματα Βήμα 2: Μετακίνησε το δίσκο n από A στον Β Βήμα 1: Μετακίνησε τους πρώτους n-1 δίσκους από A στον C αναδρομικά Βήμα 3: Μετακίνησε τους n-1 δίσκους από C στον B αναδρομικά

23 Παράδειγμα 6: Πύργοι του Hanoi (συν.) import java.util.scanner; public class TowersOfHanoi { public static void main(string[] args) { // Create a Scanner Scanner input = new Scanner(System.in); System.out.print("Enter number of disks: "); int n = input.nextint(); // Find the solution recursively System.out.println("The moves are:"); movedisks(n, 'A', 'B', 'C'); /** The method for finding the solution to move n disks from fromtower to totower with auxtower */ public static void movedisks(int n, char fromtower, char totower, char auxtower) { if (n == 1) // Stopping condition System.out.println("Move disk " + n + " from " + fromtower + " to " + totower); else { movedisks(n - 1, fromtower, auxtower, totower); System.out.println("Move disk " + n + " from " + fromtower + " to " + totower); movedisks(n - 1, auxtower, totower, fromtower);

Αφαίρεση της Αναδρομής Η χρήση της αναδρομής επιτρέπει την επίλυση πολύπλοκων προβλημάτων με άμεσο και σαφή τρόπο. Συχνά όμως υστερεί από άποψη αποδοτικότητας. Η αφαίρεση της αναδρομής από μια συνάρτηση, δηλαδή, η μετατροπή της σε επαναληπτική συνάρτηση χωρίς αναδρομή, είναι δυνατή (κάτω από κάποιες συνθήκες). Συχνά προϋποθέτει τη χρήση κάποιων βοηθητικών δομών (π.χ. στοίβα ή ουρά. 24

Πρόβλημα 1: Μετατροπή Δεκαδικού σε Δυαδικό Συνάρτηση int2binary: εκτυπώνει την δυαδική αναπαράσταση ενός φυσικού αριθμού που δίδεται ως παράμετρος στην συνάρτηση. Πρότυπο συνάρτησης: void int2binary(int a) Παραδείγματα: int2binary(5) τυπώνει στην οθόνη 101 int2binary(11) τυπώνει στην οθόνη 1011 int2binary(15) τυπώνει στην οθόνη 1111 int2binary(124) τυπώνει στην οθόνη 1111100 25

26 Πρόβλημα: Μετατροπή Δεκαδικού σε Δυαδικό(συν.) Παράδειγμα Υπολογισμού: int2binary(11) 1011 int2binary(10) 1010 11 2 5 1 2 10 2 5 0 2 1 2 2 1 2 2 0 1 0 1 1011 1010

Υλοποίηση συνάρτησης int2binary: Α. Αναδρομή 27 11 2 5 1 2 1 2 2 Βήμα αναδρομής; Συνέχισε τη διαίρεση με το πηλίκο 1011 0 1 Βήμα Τερματισμού; Πηλίκο=1 Τι κάνουμε στο τέλος; Τυπώνουμε το πηλίκο=1 και όλα τα υπόλοιπα

Υλοποίηση συνάρτησης int2binary: Α. Αναδρομή 28 void int2binary_r( int x ){ if ( x > 1 ) int2binary_r(x/2); System.out.print(x%2);

Υλοποίηση συνάρτησης int2binary: B. Στοίβα Βήματα 1. Αρχικοποίησε Στοίβα S 2. Όσο ο διαιρετέος είναι μεγαλύτερος του 1 A. Πρόσθεσε το υπόλοιπο της διαίρεσης στην S B. Διαίρεσε το διαιρετέο διά 2 3. Βάλε το τελευταίο πηλίκο στην S 4. Όσο δεν είναι άδεια η S A. Εκτύπωσε το στοιχείο στη θέση Top B. Αφαίρεσε το στοιχείο στη θέση Top (Pop) void int2binary_s(int x) { Stack<Integer> stack = new Stack<Integer>(); stack.makeempty(); while (x > 1) { stack.push(x % 2); x = x / 2; stack.push(x); while (!stack.isempty()) { System.out.print( stack.top()); stack.pop(); 29

30 Υλοποίηση συνάρτησης int2binary: Γ. Συνάρτηση void int2binary(int x) { int binary[] = new int[33]; int i = 0; while (x > 1) { binary[i] = x % 2; x = x / 2; i++; binary[i] = x; for (int j = i; j >= 0; j--) System.out.print(binary[j]);

Πρόβλημα: Ενδοθεματική Διάσχιση ΔΔΑ Να γράψετε μη-αναδρομική μέθοδο η οποία να τυπώνει τα στοιχεία ενός ΔΔΑ σε αύξουσα σειρά. Για να το πετύχετε μπορείτε να χρησιμοποιήσετε στοίβες. 31 Η βασική ιδέα είναι η εξής: Εφόσον το δένδρο δεν είναι κενό προχωρούμε προς τα αριστερά φυλάγοντας τους κόμβους από τους οποίους περνούμε σε μία στοίβα. Όταν δεν μπορούμε να προχωρήσουμε άλλο ανασύρουμε τον κόμβο κορυφής της στοίβας, τυπώνουμε το στοιχείο του, και επαναλαμβάνουμε την ίδια διαδικασία στο δεξιό του παιδί. Yποθέτουμε την ύπαρξη υλοποίησης στοίβας και συγκεκριμένα των πράξεων, MakeEmpty, IsEmpty, Top, Pop και Push.

Ενδοθεματική Διάσχιση ΔΔΑ: Αναδρομική Μέθοδος private void inorder(binarytreenode<e> node) { if (node!= null) { inorder(node.left); System.out.print(node.key + " "); inorder(node.right); 32

Ενδοθεματική Διάσχιση ΔΔΑ: Μη Αναδρομική Μέθ. public void inorder_s(binarytreenode<e> node) { Stack<BinaryTreeNode<E>> s = new Stack<BinaryTreeNode<E>>(); s.makeempty(); while(node!=null!s.isempty()) { if(node!=null) { s.push(node); node = node.left; else{ node = s.top(); s.pop(); System.out.print(node.key + "); node = node.right; 33

34 Αναδρομή/Αφαίρεση Αναδρομής: Ασκήσεις Να γράψετε αναδρομική μέθοδο η οποία να τυπώνει τα στοιχεία ενός 2-3 δέντρου σε αύξουσα σειρά.

35 Αναδρομή/Αφαίρεση Αναδρομής: Ασκήσεις Να γράψετε μή-αναδρομική μέθοδο η οποία να τυπώνει τα στοιχεία ενός 2-3 δέντρου σε αύξουσα σειρά.