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

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

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

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

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

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

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

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

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

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

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Generics και ArrayLists

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

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

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

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

ΚΛΑΣΕΙΣ ΜΕΘΟΔΟΙ - ΑΝΤΙΚΕΙΜΕΝΑ

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

Το πρόγραμμα αρχικά διαβάζει το πλήθος των όρων της ακολουθίας Fibonacci και στη συνέχεια εμφανίζει τους όρους αυτούς:

Εξαιρέσεις (Exceptions) Λάθη (Errors) Χειρισμός των Εξαιρέσεων (Exception Handling) Assertions

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

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

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

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

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

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

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

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

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

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

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

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

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

Wrapper Classes Τοποθέτηση Δεδομένων Κλήση Μεθόδων. Παναγιώτης Σφέτσος, PhD

API: Applications Programming Interface

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

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

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

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

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

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

ΤΕΙ Θεσσαλονίκης Τμήμα Πληροφορικής

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

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

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

Πακέτα (Packages) Φωλιασμένες ή Εσωτερικές Κλάσεις (Inner Classes) Παναγιώτης Σφέτσος, PhD

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

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

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

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

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

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

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

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

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος.

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

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

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

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

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

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

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

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

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

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

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

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 2: Βασικές εντολές

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

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

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

Γράφημα. Συνδυαστικό αντικείμενο που αποτελείται από 2 σύνολα: Σύνολο κορυφών (vertex set) Σύνολο ακμών (edge set) 4 5 πλήθος κορυφών πλήθος ακμών

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

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

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

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

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

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

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

Transcript:

(Object Oriented Programming) Α Ν Α Δ Ρ Ο Μ Η (R e c u r s i o n) PhD http://aetos.it.teithe.gr/~sfetsos/ sfetsos@it.teithe.gr

Το πρότυπο Αναδρομή (Recursion) Αναδρομική μέθοδος: Όταν μία μέθοδος καλεί τον εαυτό της και έχει μια συνθήκη τερματισμού. Ατέρμονη αναδρομή είναι προγραμματιστικό λάθος και οδηγεί σε τερματισμό του προγράμματος, λόγω υπερχείλισης της στοίβας (stack overflow). Κάθε αναδρομική κλήση μιας μεθόδου δημιουργεί νέες τοπικές μεταβλητές και παραμέτρους. Πολλά πολύπλοκα προβλήματα μπορούν να λυθούν με αναδρομή. Κλασικό παράδειγμα η μέθοδος υπολογισμού παραγοντικού: n! = 1 2 3 (n-1) n, (για n>=0) 2

Το πρότυπο Αναδρομή (Recursion) Όπου: 0! = 1 n! = n(n-1)! n!=1*2*3* *(n-1) *n => n! = (n-1)! * n, π.χ. 24! = 23! * 24 Παραδείγματα: 4! = 1*2*3*4 = 3! * 4 4! = 6 * 4 = 24 3! = 1*2*3 = 2! * 3 3! = 2 * 3 = 6 2! = 1*2 = 1! *2 2! = 1 * 2 = 2 1! = 1=1!* 1 1! = 1 0! = 1 0! = 1 3

Το πρότυπο Αναδρομή (Recursion) Recursive Factorial Method : public static int fact(int num) { if (num == 0) return 1; Με παράμετρο 4: else return num * fact(num 1);} παγώνει, αποθηκεύει καλεί : : : : : : : : Χρησιμοποιώντας την τιμή 1 του 0! (βήμα διακοπής) είναι δυνατός ο υπολογισμός του 4! Επιστρέφοντας στον υπολογισμό του 1!, του 2!, 3! και τέλος 4! (σχήμα) 4

Το πρότυπο Αναδρομή (Recursion) Μια άλλη απεικόνιση, για n=4: factorial(4) = 4*factorial(3) factorial(3) = 3*factorial(2) factorial(2) = 2*factorial(1) factorial(1) = 1*factorial(0) factorial(0) = 1 Η τελευταία τιμή 1 μεταβιβάζεται στην προηγούμενη κλήση και έτσι υπολογίζεται το factorial(1) = 1. Ομοίως: factorial(2) = 2*1 = 2, factorial(3) = 3*2 = 6 factorial(4) = 4*6 = 24 5

Το πρότυπο Αναδρομή (Recursion) Μια λύση με χρήση αντικειμένου: class Anadromi { public double paragontiko(int n) { if(n==0) return 1; //συνθήκη τερματισμού if(n<0) return 0; return n*paragontiko(n-1); //αναδρομικό βήμα }} class TestAnadromi {public static void main(string args[]) { Anadromi Q =new Anadromi(); System.out.println("To paragontiko tou 4 einai: " + Q.paragontiko(4)); }} 6

Το πρότυπο Αναδρομή (Recursion) Μια λύση με χρήση στατικής μεθόδου: import java.util.scanner; public class Anadromi { public static void main(string[] args) { Scanner input = new Scanner(System.in); System.out.print("Dose ena thetiko arithmo: "); int n = input.nextint(); System.out.println("To paragontiko tou " + n + " einai " + factorial(n)); } public static long factorial(int n) { if (n == 0) // synthiki termatismou return 1; else return n * factorial(n - 1); // anadromiki klisi }} 7

Το πρότυπο Αναδρομή (Recursion) Επαναληπτική υλοποίηση χωρίς αναδρομή: class EpanaliptikoFactorial { public static void main(string args[]){ int i=factorial(4); System.out.println(" To 4! = "+i); } public static int Factorial(int n) { int i, result; result = 1; for (i = 2; i<= n; i++) { result = result * i; } return result; } 8

Το πρότυπο Αναδρομή (Recursion) Να λυθεί η άσκηση - 1: Υπολογισμός δύναμης: power(int a, int n), (2- παράμετροι, βάση και δύναμη) Είναι: a 0 =1 a n =a n-1.a (n>=1) int power(int a, int n) { int p; if (n==0) p = 1; else p = a*power(a,n-1); return p; } Μια προτεινόμενη αναδρομική σχέση: p = a*power(a, n-1); Παράδειγμα: 9

Το πρότυπο Αναδρομή (Recursion) Να λυθεί η άσκηση - 2: Εμφάνιση των ψηφίων ενός ακέραιου αριθμού αντίστροφα. Χρησιμοποιείστε μια στατική αναδρομική μέθοδο, π.χ.: public static void reversedisplay(int value) Δηλ. αν reversedisplay(87654), τότε θα εμφανίσει 45678. 10

Ακολουθία αριθμών Fibonacci (1/5) Η ακολουθία αριθμών: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,... είναι η σειρά Fibonacci. Χαρακτηριστικό: κάθε αριθμός της σειράς προκύπτει από το άθροισμα των δύο προηγούμενων αριθμών. Η ακολουθία Fibonacci εμφανίζεται στην φύση, στα ζώα (κουνέλια) και στα φυτά, αλλά και στην μουσική και την τέχνη γενικότερα. Ένας μαθηματικός τύπος για την εύρεση οποιουδήποτε όρου n της σειράς είναι: Προγραμματιστικά; 11

Ακολουθία αριθμών Fibonacci (2/5) Προγραμματιστικά: Η ακολουθία ορίζεται ως: fib(0) = 0; fib(1) = 1; fib(index) = fib(index - 2) + fib(index - 1); index >= 2 Fib(n) = fib(n-1) + fib(n-2) f(1),f(2),f(3),f(4),f(5),f(6),f(7),f(8),... 1, 1, 2, 3, 5, 8, 13, 21,... 1+1 1+2 2+3 3+5 5+8 8+13 Συνθήκη τερματισμού: οι δύο πρώτοι αριθμοί είναι ίσοι με την μονάδα (1) 12

Ακολουθία αριθμών Fibonacci (3/5) Δηλαδή, Μπορούμε να βρούμε εύκολα την θέση - index ενός αριθμού, π.χ. fib(2), επειδή γνωρίζουμε τα fib(0) και fib(1), άρα για οποιαδήποτε θέση: fib(index) = fib(index - 2) + fib(index - 1). Αναδρομική κλήση μέχρι ο index να γίνει 0 ή 1. 13

Ακολουθία αριθμών Fibonacci (4/5) Αναδρομική αναζήτηση όρου στην ακολουθία Fibonacci (με αντικείμενο): class Fibonacci { public int Fib(int b) { if(b==1 b==2)return 1; return (Fib(b-1) + Fib(b-2)); }} class TestFibonacci { public static void main(string args[]) { Fibonacci f = new Fibonacci(); System.out.println(f.Fib(7)); }} 14

Ακολουθία αριθμών Fibonacci (5/5) Αναδρομική αναζήτηση όρου στην ακολουθία Fibonacci (με στατική μέθοδο): import java.util.scanner; public class Fibonacci1 { public static void main(string[] args) { Scanner input = new Scanner(System.in); System.out.print("Dose ena thetiko arithmo: "); int n = input.nextint(); System.out.println("H " + n + " thesi tis akolouthias antistoixei ston ar." + fibo(n)); } public static int fibo (int num) { if (num == 1 num == 2) return 1; else return fibo(num-1) + fibo(num-2); }} 15

Παλίνδρομοι αριθμοί (1/3) Ένας αριθμός λέγεται παλίνδρομος, όταν διαβάζεται το ίδιο από αριστερά προς τα δεξιά και από τα δεξιά προς τα αριστερά, δηλ. τα στοιχεία του είναι συµµετρικά ως προς το κέντρο, π.χ. οι αριθμοί 353, 42624, κλπ. Μια τεχνική είναι να αντιστρέψουμε τον αριθμό και μετά να τον συγκρίνουμε με τον αρχικό αριθμό. Αν είναι ίσοι τότε είναι παλινδρομικοί. Ο αριθμός χωρίζεται στα ψηφία του διαιρούμενος με το 10 ή με δυνάμεις του 10. Χρησιμοποιούμε τα σύμβολα της ακέραιας διαίρεσης (/) και του υπολοίπου (%). Έστω ο αρ. n=22342: εντοπίζω το τελευταίο ψηφίο το 2, από το υπόλοιπο της διαίρεσης του αριθμού με το 10 και αναδρομικά επαναλαμβάνω το ίδιο (εντοπισμός του τελευταίου ψηφίου) αλλά με τον νέο αριθμό (2234), που είναι το πηλίκο του αριθμού με το 10, έτσι 16

Παλινδρομικοί αριθμοί (2/3) κάθε φορά που εντοπίζω το τελευταίο ψηφίο θα δημιουργώ ένα νέο αριθμό (τον αντίστροφο) που τελικά θα τον συγκρίνουμε με τον αρχικό. συνθήκη τερματισμού το πηλίκο να ισούται µε 0. n Πηλίκο Υπόλοιπο Αντίστροφος 22342 / 10 = 2234 22342 % 10 = 2 0*10 + 2 = 2 2234 / 10 = 223 2234 % 10 = 4 2*10 +4 = 24 223 / 10 = 22 223 % 10 = 3 24*10+3 = 243 22 / 10 = 2 22 % 10 = 2 243*10+2 = 2432 2 / 10 = 0 2 % 10 = 2 2432*10+2 = 24322 Αλγόριθμος: να καλούμε αναδρομικά την μέθοδο αντιστροφής με τον ακέραιο διαιρούμενο (ακέραια διαίρεση) δια του 10. Αν ο αριθμός π.χ. είναι ο 22342, τότε η κλήση κάθε φορά θα είναι: 2234, 223, 22, 2. Πρέπει όμως να τοποθετούμε σε μια μεταβλητή τον εκάστοτε αριθμό δηλ.: 0+2, 10*2+4, 10*24+3, κλπ.). 17

Παλινδρομικοί αριθμοί (3/3) class palidromes { static int rev=0; public static int REV(int num) { if(num>0) { rev=(rev*10)+ (num %10); //System.out.println(rev*10+" "+num%10+ " REV(num/10); //klisi tis methodoy me anadromi } return rev; } } "+rev ); class Testpalidromes { public static void main(string args[]) { int x=12345; int y=palidromes.rev(x); System.out.println(y); if (x==y) System.out.println("Palidromikoi arithmoi"); else System.out.println("Mi Palidromikoi arithmoi"); } } 18

Παλινδρομικά Strings (1/2) Όπως με τους αριθμούς έτσι και ένα String λέγεται παλινδρομικό, όταν διαβάζεται το ίδιο από αριστερά προς τα δεξιά και από τα δεξιά προς τα αριστερά, π.χ. anna, anana, radar, κλπ. Μια τεχνική είναι να συγκρίνουμε αναδρομικά τον 1 ο χαρακτήρα με τον τελευταίο, τον 2 ο με τον προτελευταίο κλπ. Αν σε κάποια αναδρομική κλήση βρεθούν άνισοι χαρακτήρες, τότε τελειώνει η αναδρομή και τα Strings δεν είναι παλινδρομικά. Ο αλγόριθμος είναι: αν ο 1 ος χαρ. είναι ίδιος με τον τελευταίο, τότε συνεχίζουμε με το δεύτερο ζεύγος (2 ος με προτελευταίο κλπ.). Κάθε φορά η αναδρομή καλείται με το substring κομμένο από τον 1 ο και τελευταίο χαρ. του String. 19

Παλινδρομικά Strings (2/2) import java.util.scanner; public class PalindromeString { public static boolean ispal(string s){ if(s.length() == 0 s.length() == 1) return true; //einai palidromo //an o 1os einai idios me ton teleytaio, tote synexise gia // to epomeno substring me 1o kai teleytaio komena if(s.charat(0) == s.charat(s.length()-1)) return ispal(s.substring(1, s.length()-1)); // an ohi tote o eleghos peftei se lathos. return false;} public static void main(string[]args) { Scanner sc = new Scanner(System.in); System.out.println("Dose ena String "); String x = sc.nextline(); if(ispal(x))system.out.println(x + " einai palidromo"); else System.out.println(x + " den einai palidromo"); } }} 20

Πρώτοι Αριθμοί (1/2) Στα μαθηματικά πρώτος αριθμός (ή απλά πρώτος) είναι ένας φυσικός αριθμός μεγαλύτερος της μονάδας με την ιδιότητα οι μόνοι φυσικοί διαιρέτες του να είναι η μονάδα και ο εαυτός του (wiki), π.χ. 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, κλπ. Ο αρ. 5 είναι πρώτος, γιατί διαιρείται δια του 1 και του 5, ενώ ο αρ. 8 είναι σύνθετος, γιατί διαιρείται δια του 1, του 8 και του 2 (8 % 2 = 0). Αναδρομικός τρόπος (αλγόριθμος του WILSON για όχι πολύ μεγάλο n) Αν το: (1+factorial (n-1)) % n ισούται με 0, τότε το n είναι πρώτος αρ. 21

Πρώτοι Αριθμοί (2/2) Έλεγχος για τους πρώτους 25 αριθμούς class Prime { public static void main(string[] arg) { for(int i = 1; i < 25; i++) { System.out.println(" " + i + " einai prime" + isprime(i, i-1)); }} static boolean isprime(int num, int div) { if(div <= 1) {return true;} if(num % div == 0) {return false;} return isprime(num, div-1); }} 22

Οι Πύργοι του Ανόι (towers of Hanoi) (1/6) Σύμφωνα με τον μύθο σε έναν ναό της Άπω Ανατολής, οι ιερείς προσπαθούσαν να μεταφέρουν μια στοίβα χρυσών δίσκων από ένα στύλο σε ένα άλλο. Ο αρχικός στύλος έχει 64 δίσκους τοποθετημένους σε φθίνουσα σειρά μεγέθους από κάτω προς τα πάνω. Η μεταφορά των δίσκων από τον πρώτο στύλο στον τρίτο πρέπει να γίνει με τους εξής κανόνες: Κάθε φορά μεταφέρεται μόνο ένας δίσκος. Σε καμιά περίπτωση δεν μπορεί ένας μεγαλύτερος δίσκος να τοποθετηθεί πάνω σε ένα μικρότερο Ο δεύτερος στύλος μπορεί να χρησιμοποιηθεί για προσωρινή τοποθέτηση. Για τη μεταφορά : 3 δίσκων απαιτούνται 7 κινήσεις δηλ 4 δίσκων απαιτούνται 15 κινήσεις δηλ 5 δίσκων απαιτούνται 31 κινήσεις δηλ 23-1 κινήσεις. 24-1 κινήσεις. 25-1 κινήσεις. 23

Οι Πύργοι του Hanoi (towers of Hanoi) (2/6) Το πρόβλημα των 3-δίσκων μπορεί να λυθεί και χωρίς πρόγραμμα. Σε κάθε µεταφορά (transfer) n δίσκων, υπάρχει ένας στύλος αφετηρία (source), ένας στύλος προορισµός (destination), και ένας βοηθητικός / αποθηκευτικός (storage). Η µέθοδος µετακίνηση µπορεί να περιγραφεί ως εξής: movedisks(int n, char source, char destination, char storage) 24

Οι Πύργοι του Hanoi (towers of Hanoi) (3/6) 25

Οι Πύργοι του Hanoi (towers of Hanoi) (4/6) 26

Οι Πύργοι του Hanoi (towers of Hanoi) (5/6) Για περισσότερους δίσκους; Δύσκολο πρόβλημα. Σπάει σε 3 υπό-προβλήματα : (1) Μετακινούμε αναδρομικά τους πρώτους n-1 δίσκους από το Α στο C με την βοήθεια του Β (βήμα 1). (2) Μετακινούμε τον δίσκο n από το Α στο Β (βήμα 2) (3) Μετακινούμε αναδρομικά τους n-1 δίσκους από το C στο B, με την βοήθεια του A (βήμα 3). (fig. από το βιβλίο του D.Liang) 27

Οι Πύργοι του Hanoi (towers of Hanoi) (6/6) Να λυθεί η άσκηση - 3: Να γραφεί το πρόγραμμα που μετακινεί οποιοδήποτε πλήθος δίσκων (το πλήθος θα εισάγεται από το πληκτρολόγιο) από μία θέση (π.χ. Α) σε μια άλλη (π.χ. C) με την βοήθεια μιας τρίτης (π.χ. Β). Αν λάβετε υπόψιν τον προηγούμενο αλγόριθμο θα χρειαστείτε τις παρακάτω μεταβλητές: - το πλήθος των δίσκων n - τρείς μεταβλητές τύπου char τις A, B, και C Μία αναδρομική μέθοδος (σύμφωνα με τον προηγούμενο αλγόριθμο ) θα ήταν της μορφής: void movedisks(int n, char A, char C, char B) 28