Πξνγξακκαηηζκόο Ι (ΗΥ120) Γηάιεμε 18: Λύζε Πξνβιεκάησλ κε Αλαδξνκή
Οη πύξγνη ηνπ Hanoi Γίλεηαη έλα ρώξνο κε ηξείο ζέζεηο απνζήθεπζεο. Γίλεηαη κηα ζηνίβα από Ν πιάθεο ζε θζίλσλ κέγεζνο, ζε κηα από ηηο ηξείο ζέζεηο. Εεηνύκελν: κεηαθίλεζε ηελ ζηνίβα ζε κηα άιιε ζέζε ρσξίο πνηέ λα βάιεηο κηα κεγαιύηεξε πιάθα πάλσ από κηα κηθξόηεξε πιάθα. 2 Α Β Γ
Λύζε κε 1 πιάθα 3 Α Β Γ
Λύζε κε 2 πιάθεο 4 Α Β Γ
Λύζε κε 2 πιάθεο 5 Α Β Γ
Λύζε κε 2 πιάθεο 6 Α Β Γ
Λύζε κε 2 πιάθεο 7 Α Β Γ
Λύζε κε 2 πιάθεο 8 Α Β Γ
Λύζε γηα Ν πιάθεο Θεσξνύκε όηη νη κηθξόηεξεο Ν-1 πιάθεο είλαη κηα πιάθα, ε κεηαθίλεζε ηεο νπνίαο κπνξεί λα γίλεη πιένλ αλαδξνκηθά (Ν-1 πιάθεο πξέπεη λα κεηαθηλεζνύλ από κηα ζέζε ζε κηα άιιε κέζσ κηαο ηξίηεο). 9 Α Β Γ
Μνληεινπνίεζε ηεο ιύζεο Μεηαθίλεζε Ν πιάθεο από ηελ ζέζε Α κέζσ ηεο ζέζεο Β ζηελ ζέζε Γ: Απιή πεξίπησζε: αλ Ν==1 ηόηε κεηαθέξνπκε ηελ πιάθα από ηελ ζέζε Α απ επζείαο ζηελ ζέζε Γ. Πνιύπινθε πεξίπησζε: αλ Ν>1, ηόηε (α) κεηαθέξνπκε ηηο πάλσ Ν-1 πιάθεο από ηελ ζέζε Α κέζσ ηεο ζέζεο Γ ζηελ ζέζε Β, (β) κεηαθέξνπκε ηελ (κηα) πιάθα πνπ απέκεηλε από ηελ ζέζε Α απ επζείαο ζηελ ζέζε Γ, θαη (γ) κεηαθέξνπκε ηηο Ν-1 πιάθεο από ηελ ζέζε Β κέζσ ηεο ζέζεο Α ζηελ ζέζε Γ. 10
11 void movetower(int from, int through, int to, int n) { if (n==1) { movepiece(from,to); else { movetower(from,to,through,n-1); movepiece(from,to); movetower(through,from,to,n-1);
Σρεδίαζε αλαδξνκηθώλ ζρεκάησλ Ζ draw_cross(int x, int y, int len) δσγξαθίδεη έλα ζηαπξό, κε θέληξν ην ζεκείν (x,y) θαη κήθνο 2*len. 12 len x y
Σρεδίαζε αλαδξνκηθώλ ζρεκάησλ Εεηνύκελν: πινπνηήζηε κηα ζπλάξηεζε πνπ ζρεδηάδεη ηα εμήο ζρήκαηα κε βάζε ηηο αθέξαηεο παξακέηξνπο x, y, len θαη level. level=1 level=2 level=3 13 len len len len x,y len x,y len x,y
Σρεδίαζε αλαδξνκηθώλ ζρεκάησλ Παξαηήξεζε: ην ίδην ζρέδην επαλαιακβάλεηαη ζε κηθξόηεξε θιίκαθα ζε όια ηα ηεηαξηεκόξηα ηνπ ζρεδίνπ ηεο ακέζσο κεγαιύηεξεο θιίκαθαο. level=1 level=2 level=3 14
void draw_grid(int x, int y, int len, int level) { if (level==1) { draw_cross(x,y,len); else { draw_cross(x,y,len); draw_drid(x-len/2,y+len/2,len/2,level-1); draw_grid(x-len/2,y-len/2,len/2,level-1); draw_grid(x+len/2,y-len/2,len/2,level-1); draw_grid(x+len/2,y+len/2,len/2,level-1); 15
Αλαδξνκή θαη επαλάιεςε Οη πεξηζζόηεξεο κνξθέο επαλάιεςεο κπνξεί λα εθθξαζηνύλ κε αλαδξνκή, αξθεί ε ζπλάξηεζε λα πεξλά ζηνλ εαπηό ηεο ηηο θαηάιιειεο παξακέηξνπο. Αληίζεηα, ππάξρνπλ αξθεηέο κνξθέο αλαδξνκήο πνπ είλαη δύζθνιν λα εθθξαζηνύλ κε επαλάιεςε. Τν θύξην πιενλέθηεκα ηεο αλαδξνκήο είλαη όηη ε ζπλάξηεζε θξαηά δπλακηθή ελδηάκεζε θαηάζηαζε κέζα από ηηο ηνπηθέο κεηαβιεηέο (πιαίζην εθηέιεζεο) θάζε (αιπζηδσηήο) αλαδξνκηθήο θιήζεο. Παξόκνην απνηέιεζκα κπνξεί λα επηηεπρζεί θαη κε ζπκβαηηθό ηξόπν, αιιά ε δηαρείξηζε ηεο θαηάζηαζεο πξέπεη λα γίλεη από ηνλ ίδην ηνλ πξνγξακκάηηζηή (ζπλήζσο ρξεζηκνπνηώληαο δπλακηθή κλήκε). 19
Σπλδπαζηηθά πξνβιήκαηα
Δπίιπζε ζπλδπαζηηθώλ πξνβιεκάησλ 21 Σπρλά έλα πξόβιεκα κπνξεί λα εθθξαζηεί σο κηα «αλαδήηεζε» ελόο επηηξεπηνύ ζπλδπαζκνύ θάπνησλ κεηαβιεηώλ κέζα από όινπο ηνπο δπλαηνύο ζπλδπαζκνύο πνπ κπνξεί λα γίλνπλ. Κάπνηεο θνξέο, ην δεηνύκελν είλαη λα βξεζεί ν βέιηηζηνο ζπλδπαζκόο, πνπ ειαρηζηνπνηεί ή κεγηζηνπνηεί θάπνηα ζπλάξηεζε ησλ κεηαβιεηώλ. Λύζε κε αλαδξνκή: 1. Καηαζθεπάδνπκε ην ζύλνιν ησλ ζπλδπαζκώλ αλαδξνκηθά (κε δηεμνδηθή «αλαδήηεζε» ζε βάζνο). 2. Διέγρνπκε θάζε ζπλδπαζκό γηα ην θαηά πόζν είλαη επηηξεπηόο ή/θαη θαιύηεξνο ζε ζρέζε κε ηνπο ζπλδπαζκνύο πνπ έρνπλ θαηαζθεπαζηεί / εμεηαζηεί.
Γέληξα ζπλδπαζκώλ θαη απνθάζεσλ Όινη νη δπλαηνί ζπλδπαζκνί (κεηαβιεηώλ) κπνξεί λα κνληεινπνηεζνύλ (αλαπαξαζηαζνύλ) σο έλα δέληξν. Κάζε θόκβνο ηνπ δέληξνπ ζε επίπεδν L αληηζηνηρεί ζε έλα ζπγθεθξηκέλν ζπλδπαζκό επηινγώλ (ηηκώλ) γηα L δηαθνξεηηθέο κεηαβιεηέο. Ξεθηλώληαο από έλα θόκβν ζε επίπεδν L, επηιέγνπκε ηελ επόκελε κεηαβιεηή, θαη γηα θάζε ηηκή πνπ απηή κπνξεί λα ιάβεη θαηαζθεπάζνπκε έλα θόκβν παηδί ζε επίπεδν L+1, θιπ. Έλαο θόκβνο απνηειεί «θύιιν» όηαλ δελ ππάξρνπλ άιιεο «ειεύζεξεο» κεηαβιεηέο όιεο έρνπλ ιάβεη ζπγθεθξηκέλεο ηηκέο. 22
(αναδρομική) παραγφγή όλφν ηφν δσναηών ζσνδσαζμών 23 έλεγτος για επιθσμηηούς ή βέληιζηοσς ζσνδσαζμούς δσναηοί ζσνδσαζμοί επιθσμηηοί ζσνδσαζμοί
Απνθπγή ηεο ζπλδπαζηηθήο έθξεμεο 24 Ο αξηζκόο ησλ κεηαβιεηώλ κπνξεί λα είλαη κεγάινο θαη νη πηζαλέο ηηκέο γηα θάζε κεηαβιεηή πνιιέο. Ζ παξαγσγή όισλ ησλ δπλαηώλ ζπλδπαζκώλ απαηηεί πόξνπο (κλήκε, ρξόλνο) κπνξεί λα είλαη πξαθηηθά αλέθηθηε (αθόκα θαη κε ηε ζεκεξηλή ηερλνινγία). Δπηπιένλ, νη πεξηζζόηεξνη από ηνπο ζπλδπαζκνύο πνπ παξάγνληαη «ζηα ηπθιά» είλαη θαηαδηθαζκέλνη εθ ησλ πξνηέξσλ (πνιύ πξηλ δεκηνπξγεζνύλ νη ηεξκαηηθνί θόκβνη «θύιια» ηνπ δέληξνπ) λα κελ επηιεγνύλ πνηέ σο επηζπκεηνί (ή βέιηηζηνη). Βειηηζηνπνίεζε: πξόσξνο απνθιεηζκόο νιόθιεξσλ ππνδέληξσλ από ηελ ξίδα ηνπο ρσξίο ππνινγηζκό ησλ αληίζηνηρσλ ζπλδπαζκώλ (branch and bound).
παραγφγή ηφν ζσνδσαζμών με αποκλεισμό όλφν ηφν «αδιάθορφν» σποδένηρφν 25 δεν παράγεηαι επιπλέον έλεγτος για επιθσμηηούς ή/και βέληιζηοσς ζσνδσαζμούς επιθσμηηοί ζσνδσαζμοί
Απιό παξάδεηγκα - 8 Queens Εεηνύκελν: λα βξεζεί ιύζε ζην εμήο πξόβιεκα: λα ηνπνζεηεζνύλ 8 ληάκεο ζε κηα ζθαθηέξα έηζη ώζηε λα κελ απεηινύληαη κεηαμύ ηνπο 26
Δληνπηζκόο ζύγθξνπζεο (col,row) ίδια κολώνα: col==col διαγώνιος 1: col+row==col +row 27 ίδια γραμμή: row==row (0,0) διαγώνιος 2: col-row==col -row int check(int col1,int row1,int col2,int row2) { return((col1!=col2) && (row1!=row2) && (col1+row1!=col2+row2) && (col1-row1!=col2-row2));
Γύν πξνζεγγίζεηο Πξνζέγγηζε 1 (brute force): 1. Γεκηνπξγνύκε όινπο ηνπο ζπλδπαζκνύο ζέζεσλ. 2. Γηαγξάθνπκε ηνπο ζπλδπαζκνύο όπνπ δύν ή πεξηζζόηεξεο ληάκεο απεηινύλ ε κηα ηελ άιιε. 3. Οη ζπλδπαζκνί πνπ απνκέλνπλ είλαη απνδεθηνί. Πξνζέγγηζε 2 (branch and bound - b&b): 1. Γηα θάζε λέα ληάκα πνπ ηνπνζεηνύκε, ειέγρνπκε πξνθαηαβνιηθά θαηά πόζν απεηιεί κηα από ηηο ληάκεο πνπ έρνπλ ήδε ηνπνζεηεζεί ζηε ζθαθηέξα. 2. Σε απηή ηε πεξίπησζε, ηεξκαηίδνπκε ηελ αλαδξνκή (όινη νη πεξαηηέξσ ζπλδπαζκνί είλαη κε απνδεθηνί). 3. Οη ζπλδπαζκνί πνπ κέλνπλ είλαη νη επηζπκεηνί. 28
αριθμός ζηήλης για ηις νηάμες 0<=i<n ποσ έτοσν ηοποθεηηθεί μέτρι ζηιγμής αριθμός γραμμής για ηις νηάμες 0<=i<n ποσ έτοσν ηοποθεηηθεί μέτρι ζηιγμής 29 void putnxtqueen(int cols[], int rows[], int n, int M) { αριθμός επόμενης νηάμας προς ηοποθέηηζη ηελικός αριθμός από νηάμες προς ηοποθέηηζη /* κλήση */ #define Μ 8 int main (int argc, char *argv[]) { int cols[μ],rows[μ]; putnxtqueen(cols,rows,0,μ); return(0);
Πξνζέγγηζε 1 (έιεγρνο ζην ηέινο) void putnxtqueen(int cols[], int rows[], int n, int M) { int i,j; (άζκοπη) δημιοσργία όλφν ηφν ζσνδσαζμών (θύλλφν ηοσ δένηροσ) if (n<m) { for (i=0; i<m; i++) { for (j=0; j<m; j++) { cols[n]=j; rows[n]=i; putnxtqueen(cols,rows,n+1,m); απόρριυη ζσνδσαζμού (θύλλοσ) αν σπάρτει κάποια ζύγκροσζη else { for (i=0; i<m; i++) { for (j=i; j<m; j++) { if (!check(cols[i],rows[i],cols[j],rows[j])) {return; for (i=0; i<m; i++) {printf("(%d,%d)\n",cols[i],rows[i]); εκηύπφζη αποδεκηού ζσνδσαζμού 30
Πξνζέγγηζε 2 (έιεγρνο ζηελ ηνπνζέηεζε) void putnxtqueen(int cols[], int rows[], int n, int M) { int i,j,k,ok; if (n<m) { for (i=0; i<m; i++) { for (j=0; j<m; j++) { ok = 1; for (k=0; (k<n) && (ok); k++) { ok = check(j,i,cols[k],rows[k]); if (ok) { col[n]=j; row[n]=i; putnxtqueen(cols,rows,n+1,m); έλεγτος ζύγκροσζης για ηην νέα ηοποθέηηζη j,i εκηύπφζη αποδεκηού ζσνδσαζμού else { for (i=0; i<m; i++) {printf("(%d,%d)\n",cols[i],rows[i]); 31
Βειηηζηνπνίεζε Αθόκα θαη έλαο πξσηάξεο ζθαθηζηήο, κπνξεί λα ζπκπεξάλεη όηη θάζε ληάκα πξέπεη ππνρξεσηηθά λα ηνπνζεηεζεί ζε μερσξηζηή γξακκή. Ηδέα: παξάγνπκε ηνπο ζπλδπαζκνύο ππό ηνλ πεξηνξηζκό όηη ε i-νζηή ληάκα ηνπνζεηείηαη (θάπνπ) ζηελ i-νζηή γξακκή. Ζ ιύζε αθνινπζεί ηε θηινζνθία ηεο πξνζέγγηζεο 2, αιιά απνθεύγεη κε ηδηαίηεξα απνδνηηθό ηξόπν πάξα πνιινύο κε απνδεθηνύο ζπλδπαζκνύο. Σεκείσζε: ε ζπλάξηεζε δελ ρξεηάδεηαη λα δέρεηαη πιένλ σο παξάκεηξν ηνπο αξηζκνύο γξακκήο από ηηο ληάκεο πνπ έρνπλ ηνπνζεηεζεί, αθνύ row[i]==i. 32
αριθμός ζηήλης για ηις νηάμες 0<=i<n ποσ έτοσν ηοποθεηηθεί μέτρι ζηιγμής ο αριθμός γραμμής για ηις νηάμες 0<=i<n ποσ έτοσν ηοποθεηηθεί μέτρι ζηιγμής είναι row[i]==i 33 void putnxtqueen(int cols[], int n, int M) { /* κλήση */ αριθμός επόμενης νηάμας προς ηοποθέηηζη ηελικός αριθμός από νηάμες προς ηοποθέηηζη #define Μ 8 int main (int argc, char *argv[]) { int cols[μ],rows[μ]; putnxtqueen(cols,0,μ); return(0);
Πξνζέγγηζε 3 void putnxtqueen(int cols[], int n, int M) { int i,k,ok; if (n<m) { for (i=0; i<m; i++) { ok = 1; for (k=0; (k<n) && (ok); k++) { ok=check(i,n,cols[k],k); if (ok) { col[n]=i; putnxtqueen(col,n+1,m); έλεγτος ζύγκροσζης για ηη νέα ηοποθέηηζη i,n εκηύπφζη αποδεκηού ζσνδσαζμού else { for (i=0; i<m; i++) {printf("(%d,%d)\n",cols[i],i); 34
Σρόιην Οη παξαπάλσ πξνζεγγίζεηο βξίζθνπλ όινπο ηνπο επηηξεπηνύο ζπλδπαζκνύο (ζπκπεξηιακβαλνκέλσλ θαη ηζνδύλακσλ «ζπκκεηξηθώλ» ιύζεσλ). Όηαλ απνξξίπηεηαη έλαο ζπλδπαζκόο (θύιιν ή/θαη ππνδέληξν) είλαη εγγπεκέλα κε απνδεθηόο. 35
Μνλνπάηη ζε γξάθν 36 Έλαο γξάθνο θσδηθνπνηείηαη κέζσ ελόο 2-δηάζηαηνπ πίλαθα c, όπνπ c[i][j]==1 αλ ππάξρεη αθκή από ηνλ θόκβν i ζηνλ j, δηαθνξεηηθά c[i][j]==0. Δπηζπκνύκε λα βξνύκε έλα κνλνπάηη από ηνλ θόκβν n1 πξνο έλα άιιν θόκβν n2: path(n1,n2) Πεξίπησζε εύθνινπ ηεξκαηηζκνύ: c[n1][n2]==1 Γεληθή πεξίπησζε: αλ n:[n1][n]==1 θαη path(n,n2) ηόηε ην δεηνύκελν κνλνπάηη είλαη n+path(n,n2), δηαθνξεηηθά, δελ ππάξρεη θαλέλα κνλνπάηη πνπ λα νδεγεί από n1 πξνο n2.
0 2 37 1 3 c[0][0]=0; c[0][1]=0; c[0][2]=1; c[0][3]=0; c[1][0]=1; c[1][1]=0; c[1][2]=0; c[1][3]=0; c[2][0]=0; c[2][1]=1; c[2][2]=0; c[2][3]=0; c[3][0]=0; c[3][0]=0; c[3][2]=1; c[3][3]=0;
int path(int n1, int n2) { int n; 38 if (c[n1][n2]) { return(1); else { for (n=0; n<n; n++) { if ((c[n1][n]) && path(n,n2)) { return(1); return(0);
Σρόιηα γηα ηελ πξνεγνύκελε ιύζε Ζ αλαδήηεζε ηνπ κνλνπαηηνύ γίλεηαη «ζε βάζνο» (depth first) Υπάξρεη θαη αλαδήηεζε «ζε πιάηνο». Δπηζηξέθεηαη ην πξώην κνλνπάηη πνπ ζα βξεζεί, ρσξίο λα εμεξεπλνύληαη νη ππόινηπεο πηζαλέο ιύζεηο. Γελ επηζηξέθεηαη εγγπεκέλα ε πην ζύληνκε δηαδξνκή (κόλν θαηά ηύρε, αλ απηή ηπραίλεη λα είλαη ε πξώηε δηαδξνκή πνπ βξέζεθε κέζσ ηεο αλαδξνκήο). Γελ ιακβάλνληαη ππ όςε πηζαλνί θύθινη ζηνλ γξάθν, νπόηε ππάξρεη πηζαλόηεηα αηέξκνλεο αλαδξνκήο. Ζ πινπνίεζε κπνξεί λα επεθηαζεί «ζρεηηθά» εύθνια έηζη ώζηε λα αληηκεησπηζηνύλ όιεο νη παξαπάλσ αδπλακίεο / αηέιεηεο. 39
Καηαζθεπή «δέληξνπ» ζπλδπαζκώλ 40 Πξνζέγγηζε «ζε βάζνο» (depth first): αξρίδνπκε από ηε ξίδα θαη θαηαζθεπάδνπκε / δηεξεπλνύκε ηνπο θόκβνπο αλά ππνδέληξν (από πάλσ πξνο ηα θάησ). Ζ πξνζέγγηζε ζε βάζνο κπνξεί εύθνια λα πινπνηεζεί αλαδξνκηθά ζε απηή ηελ πεξίπησζε νλνκάδεηαη θαη «αλαδξνκηθή θάζνδνο» (recursive descent). Πξνζέγγηζε «θαηά πιάηνο» (breadth first): αξρίδνπκε από ηε ξίδα θαη θαηαζθεπάδνπκε / δηεξεπλνύκε ηνπο θόκβνπο αλά επίπεδν (από αξηζηεξά πξνο ηα δεμηά). Ζ πξνζέγγηζε θαηά πιάηνο απαηηεί επηπιένλ δηαρείξηζε θαηάζηαζεο από ην πξόγξακκα γηα ηελ απνζήθεπζε ησλ θόκβσλ έηζη ώζηε λα γίλεηαη έιεγρνο κε ηε ζσζηή ζεηξά (νπξά FIFO).
41 1 4 7 2 3 5 6 8 9
42 1 2 3 4 5 6 7 8 9
43 1 6 11 βέληιζηος ζσνδσαζμός 2 3 7 10 12 13 4 5 8 9 ζσνδσαζμοί ποσ δεν ελέγτονηαι 14 15
44 1 2 3 βέληιζηος ζσνδσαζμός 4 5 6 7 8 9 ζσνδσαζμοί ποσ δεν ελέγτονηαι 10 11 12 13 14 15
Παξάδεηγκα Knapsack / Rucksack Γίλεηαη: αληηθείκελα Ο[i] κε βάξνο W[i] θαη αμία V[i]. Εεηνύκελν: λα επηιεγνύλ ηα αληηθείκελα ηα νπνία κεγηζηνπνηνύλ ηελ αμία ελόο θνξηίνπ κε κέγηζην ζπλνιηθό βάξνο έλα γλσζηό άλσ όξην maxweight. Πξνζέγγηζε 1 (brute force): θαηαζθεπή όισλ ησλ ζπλδπαζκώλ, θαη επηινγή ηνπ ζπλδπαζκνύ κε ηελ κεγαιύηεξε αμία ζηα πιαίζηα ηνπ επηηξεπηνύ βάξνπο. Πξνζέγγηζε 2 (branch & bound): όπσο 1, αιιά ζε θάζε βήκα ειέγρεηαη ην βάξνο ηνπ ζπλδπαζκνύ θαη απηόο απνξξίπηεηαη (πξόσξα) αλ ππεξβαίλεη ην όξην. Πξνζέγγηζε 3 (heuristic b&b): όπσο 2, αιιά ζε θάζε βήκα επηιέγεηαη (ακεηάθιεηα) ην αληηθείκελν κε ην κεγαιύηεξν εηδηθό βάξνο πνπ ρσξά ζην θνξηίν. 45
Με βέιηηζηεο (επξεηηθέο) ιύζεηο Μεξηθά πξνβιήκαηα είλαη δύζθνιν λα ιπζνύλ δηεμνδηθά, κε έιεγρν όισλ ησλ επηηξεπηώλ ζπλδπαζκώλ (κε b&b). Αθόκα θαη γηα «ζρεηηθά κηθξά» Ν, π.ρ. 10000, έλαο ζύγρξνλνο Ζ/Υ κπνξεί λα ρξεηαζηεί κέξεο ή θαη βδνκάδεο λα νινθιεξώζεη ηνλ ππνινγηζκό (αλ ζην κεηαμύ δελ ηνπ έρεη ήδε ζσζεί ε δηαζέζηκε κλήκε). Δπξεηηθέο κέζνδνη: εθηόο από ηα ππνδέληξα πνπ ζίγνπξα δελ νδεγνύλ ζε ιύζε, απνθιείνπκε θαη ηα ππνδέληξα πνπ πηζηεύνπκε, ζύκθσλα κε κηα «θνηλή» ινγηθή, όηη δελ ζα νδεγήζνπλ ζε θάπνηα (θαιή) ιύζε. Οη επξεζηηθέο κέζνδνη κεηώλνπλ ζεκαληηθά ηνλ αξηζκό ησλ ζπλδπαζκώλ πξνο έιεγρν, αιιά ζηελ γεληθή πεξίπησζε δελ νδεγνύλ εγγπεκέλα ζε βέιηηζηε ιύζε. 46
αποκλειζμός σποδένηρφν ποσ σίγουρα δεν οδηγούν ζε λύζη αποκλειζμός σποδένηρφν ποσ μάλλον δεν οδηγούν ζε λύζη 47 βέληιζηος ζσνδσαζμός
Σρόιην Ζ πξνζέγγηζε ζε βάζνο είλαη θαηάιιειε όηαλ όιεο νη ιύζεηο (θύιια ηνπ δέληξνπ) βξίζθνληαη ζην ίδην επίπεδν, π.ρ. 8 ληάκεο. Ζ πξνζέγγηζε θαηά πιάηνο είλαη θαηάιιειε όηαλ θάπνηεο ιύζεηο (θύιια ηνπ δέληξνπ) βξίζθνληαη πηζαλώο ζε δηαθνξεηηθό επίπεδν θαη γλσξίδνπκε όηη ν επηζπκεηόο ζπλδπαζκόο βξίζθεηαη ζην πην ςειό επίπεδν, π.ρ. πην ζύληνκν κνλνπάηη εμόδνπ ζε έλα ιαβύξηλζν. Σε απηή ηε πεξίπησζε ν αξηζκόο ησλ ζπλδπαζκώλ πνπ ειέγρνληαη κπνξεί λα είλαη θαηά πνιύ κηθξόηεξνο (ην δέληξν ησλ ζπλδπαζκώλ θόβεηαη νξηδόληηα, θάησ από ην επίπεδν ηεο ιύζεο). 48
Λίζηα σο αλαδξνκηθή δνκή Μηα ιίζηα κπνξεί λα ζεσξεζεί σο αλαδξνκηθή δνκή, όρη κόλν ζπληαθηηθά αιιά θαη νπζηαζηηθά: κηα ιίζηα είλαη είηε θελή, είηε απνηειείηαη από έλα θόκβν πνπ δείρλεη ζε κηα ιίζηα. Ζ αλαδήηεζε κπνξεί λα πινπνηεζεί αλαδξνκηθά, π.ρ. γηα ιίζηα ρσξίο ηεξκαηηθό ζηνηρείν σο εμήο: 1. Αλ ην πξώην ζηνηρείν ηεο ιίζηαο είλαη NULL, ηόηε ην ζηνηρείν πνπ αλαδεηνύκε δελ ππάξρεη. 2. Αλ ην πξώην ζηνηρείν ηεο ιίζηαο πεξηέρεη ηελ ηηκή πνπ αλαδεηνύκε, ηόηε βξέζεθε. 3. Αλ ην πξώην ζηνηρείν ηεο ιίζηαο δελ πεξηέρεη ηελ ηηκή πνπ αλαδεηνύκε, ζπλέρηζε ηελ αλαδήηεζε ζηελ ιίζηα ζηελ νπνία δείρλεη ν πξώηνο θόκβνο. 49
50 root A nxt C nxt B nxt
int list_find_rec(struct list *root, int v) { 51 if (root == NULL) { return(0); else if (root->v == v) { return(1); else { return(list_find_rec(root->nxt,v));