Αναδρομικοί...

62
Αναδρομικοί Αλγόριθμοι Αναδρομικός αλγόριθμος (recursive algorithm) Επιλύει ένα πρόβλημα λύνοντας ένα ή περισσότερα στιγμιότυπα του ίδιου προβλήματος.

Transcript of Αναδρομικοί...

Page 1: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Αναδρομικός αλγόριθμος (recursive algorithm)

Επιλύει ένα πρόβλημα λύνοντας ένα ή περισσότερα στιγμιότυπα

του ίδιου προβλήματος.

Page 2: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Αναδρομικός αλγόριθμος (recursive algorithm)

Επιλύει ένα πρόβλημα λύνοντας ένα ή περισσότερα στιγμιότυπα

του ίδιου προβλήματος.

Παράδειγμα: Υπολογισμός παραγοντικού

int factorial (int N) { if (N==0) return 1; return N*factorial(N-1); }

Page 3: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός παραγοντικού

int factorial (int N) { if (N==0) return 1; return N*factorial(N-1); }

t = 1; for (int i=1; i<=N; i++) t *= i;

αναδρομικό πρόγραμμα μη αναδρομικό πρόγραμμα

Page 4: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός παραγοντικού

int factorial (int N) { if (N==0) return 1; return N*factorial(N-1); }

αναδρομικό πρόγραμμα μη αναδρομικό πρόγραμμα

• Κάθε αναδρομικό πρόγραμμα μπορεί να μετατραπεί σε ισοδύναμο

μη αναδρομικό πρόγραμμα.

• Πολλές φορές όμως η χρήση αναδρομής δίνει πιο σύντομα ή/και πιο

αποδοτικά προγράμματα.

t = 1; for (int i=1; i<=N; i++) t *= i;

Page 5: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Page 6: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Page 7: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Αν ο είναι κοινός διαιρέτης των τότε

και , άρα

Page 8: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Αν ο είναι κοινός διαιρέτης των τότε

και , άρα

Αν ο είναι κοινός διαιρέτης των τότε

και , άρα

Page 9: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Επομένως

Page 10: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

int gcd (int x, int y) { if (y==0) return x; return gcd(y, x%y); }

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Page 11: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

gcd(128,40)=

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Παράδειγμα int gcd (int x, int y) { if (y==0) return x; return gcd(y, x%y); }

Page 12: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

gcd(128,40)=

gcd(40,8)=

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Παράδειγμα int gcd (int x, int y) { if (y==0) return x; return gcd(y, x%y); }

Page 13: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

gcd(128,40)=

gcd(40,8)=

gcd(8,0)=

8

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Παράδειγμα int gcd (int x, int y) { if (y==0) return x; return gcd(y, x%y); }

Page 14: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Ιδιότητα: Αν τότε

Page 15: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Ιδιότητα: Αν τότε

Απόδειξη:

Page 16: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Παράδειγμα: Υπολογισμός μέγιστου κοινού διαιρέτη

ακέραιοι όπου

: ο μεγαλύτερος ακέραιος που τους διαιρεί ακριβώς

Αλγόριθμος του Ευκλείδη

Βασίζεται στον κανόνα

όπου είναι θετικοί ακέραιοι

Ιδιότητα: Αν τότε

ο αλγόριθμος του Ευκλείδη είναι αποδοτικός :

απαιτεί επαναλήψεις

Page 17: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

private class Node { Item item; Node next; } int count(Node x) { if (x == null) return 0; return 1 + count(x.next); }

node :

item

next

Αναδρομική συνάρτηση καταμέτρησης του πλήθους των κόμβων σε μία

συνδεδεμένη λίστα

Node head

μηδενική

αναφορά (null)

Page 18: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

διάσπαση

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

Page 19: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

διάσπαση

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

επιλύουμε

αναδρομικά τα

υποπροβλήματα

Page 20: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

διάσπαση

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

επιλύουμε

αναδρομικά τα

υποπροβλήματα

Page 21: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

διάσπαση

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

επιλύουμε

αναδρομικά τα

υποπροβλήματα

Page 22: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

επιλύουμε

αναδρομικά τα

υποπροβλήματα

σύνθεση

Page 23: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

επιλύουμε

αναδρομικά τα

υποπροβλήματα

σύνθεση

Page 24: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

Αναδρομικοί Αλγόριθμοι: Διαίρει και βασίλευε

πρόβλημα μεγέθους Ν

πρόβλημα

μεγέθους Ν-k

πρόβλημα

μεγέθους k

επιλύουμε

αναδρομικά τα

υποπροβλήματα

διάσπαση προβλήματος /

σύνθεση λύσεων

Χρόνος εκτέλεσης :

χρόνος

διάσπασης

χρόνος

σύνθεσης

Page 25: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Απλό πρόβλημα : Εύρεση ελάχιστου στοιχείου ακολουθίας

t = a[0]; for (i = 1; i < N; i++) if (a[i] < t) t = a[i];

int min(int a[], int l, int r) { int u, v, m = (l+r)/2; if (l == r) return a[l]; u = min(a, l, m); v = min(a, m+1, r); if (u<v) return u; else return v; }

μη αναδρομικό πρόγραμμα

αναδρομικό πρόγραμμα

«διαίρει και βασίλευε»

Page 26: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

1

Ν

Θέλουμε να μετακινήσουμε τους δίσκους κατά ένα πάσσαλο δεξιά,

υπακούοντας στους παρακάτω κανόνες

1) Μετακινούμε ένα δίσκο τη φορά

2) Ένας δίσκος δεν μπορεί να τοποθετηθεί πάνω από μικρότερο δίσκο

Page 27: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

1

Ν

Θέλουμε να μετακινήσουμε τους δίσκους κατά ένα πάσσαλο δεξιά,

υπακούοντας στους παρακάτω κανόνες

1) Μετακινούμε ένα δίσκο τη φορά

2) Ένας δίσκος δεν μπορεί να τοποθετηθεί πάνω από μικρότερο δίσκο

Η χρήση αναδρομής μας βοηθά να βρούμε μια κομψή λύση στο πρόβλημα.

Page 28: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

1

Ν

+1 : Μετακίνηση κατά 1 πάσσαλο δεξιά. Επιστρέφουμε στον αριστερότερο

πάσσαλο αν ξεκινήσουμε από τον δεξιότερο.

-1 : Μετακίνηση κατά 1 πάσσαλο αριστερά. Επιστρέφουμε στον δεξιότερο

πάσσαλο αν ξεκινήσουμε από τον αριστερότερο.

Συμβολισμός

Page 29: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

1

Ν

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

Page 30: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

1

Ν

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

Page 31: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ν

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

1

Ν-1

Page 32: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

2. Μετακινούμε το δίσκο Ν κατά ένα πάσσαλο δεξιά.

Ν

1

Ν-1

Page 33: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

2. Μετακινούμε το δίσκο Ν κατά ένα πάσσαλο δεξιά.

1

Ν Ν-1

Page 34: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

2. Μετακινούμε το δίσκο Ν κατά ένα πάσσαλο δεξιά.

3. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

1

Ν Ν-1

Page 35: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

2. Μετακινούμε το δίσκο Ν κατά ένα πάσσαλο δεξιά.

3. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

1

Ν

Page 36: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

2. Μετακινούμε το δίσκο Ν κατά ένα πάσσαλο δεξιά.

3. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

1

Ν

Η μετακίνηση των Ν-1 γίνεται με μαγικό τρόπο!

Page 37: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

3 πάσσαλοι και Ν δίσκοι

Ιδέα για αναδρομικό αλγόριθμο

Ας υποθέσουμε ότι ξέρουμε πώς να μετακινήσουμε του πρώτους Ν-1 δίσκους

κατά 1 πάσσαλο δεξιά ή αριστερά.

1. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

2. Μετακινούμε το δίσκο Ν κατά ένα πάσσαλο δεξιά.

3. Μετακινούμε του πρώτους Ν-1 δίσκους κατά 1 πάσσαλο αριστερά.

1

Ν

Η μετακίνηση των Ν-1 γίνεται με μαγικό τρόπο!

αναδρομικά!

Page 38: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1)

Page 39: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1)

Page 40: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1)

Page 41: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1)

Page 42: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1)

Page 43: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1)

Page 44: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1)

Page 45: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1)

Page 46: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1)

Page 47: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1)

Page 48: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1)

Page 49: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1)

Page 50: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1)

Page 51: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1)

Page 52: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1)

Page 53: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1)

Page 54: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1)

Page 55: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1)

Page 56: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1)

Page 57: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1)

Page 58: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1)

Page 59: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

hanoi(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(3,+1) hanoi(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1) shift(2,-1) hanoi(1,+1) hanoi(0,-1) shift(1,+1) hanoi(0,-1)

Page 60: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

3 πάσσαλοι και Ν δίσκοι

1

Ν

Θέλουμε να μετακινήσουμε τους δίσκους κατά ένα πάσσαλο δεξιά,

υπακούοντας στους παρακάτω κανόνες

1) Μετακινούμε ένα δίσκο τη φορά

2) Ένας δίσκος δεν μπορεί να τοποθετηθεί πάνω από μικρότερο δίσκο

Αριθμός κινήσεων :

Page 61: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

3 πάσσαλοι και Ν δίσκοι

1

Ν

Θέλουμε να μετακινήσουμε τους δίσκους κατά ένα πάσσαλο δεξιά,

υπακούοντας στους παρακάτω κανόνες

1) Μετακινούμε ένα δίσκο τη φορά

2) Ένας δίσκος δεν μπορεί να τοποθετηθεί πάνω από μικρότερο δίσκο

Αριθμός κινήσεων :

Page 62: Αναδρομικοί Αλγόριθμοιloukas/courses/Data_Structures/index...Αναδρομικοί Αλγόριθμοι Οι Πύργοι του Ανόι 3 πάσσαλοι και

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

Οι Πύργοι του Ανόι

void hanoi(int N, int d) { if (N==0) return; hanoi(N-1,-d); shift(N,d); hanoi(N-1,-d); }

3 πάσσαλοι και Ν δίσκοι

1

Ν

Θέλουμε να μετακινήσουμε τους δίσκους κατά ένα πάσσαλο δεξιά,

υπακούοντας στους παρακάτω κανόνες

1) Μετακινούμε ένα δίσκο τη φορά

2) Ένας δίσκος δεν μπορεί να τοποθετηθεί πάνω από μικρότερο δίσκο

Αριθμός κινήσεων :