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

Σχετικά έγγραφα
ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 8: Συναρτήσεις. Κ.

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 6: Πίνακες. Κ.

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 4: Έλεγχος Ροής. Κ.

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 9: Συναρτήσεις Εμβέλεια

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 3: Είσοδος και Έξοδος Δεδομένων

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό. Ενότητα 5: Εντολές Επανάληψης

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

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

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

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Eισαγωγή στον Προγραμματισμό

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

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Εισαγωγή στον Προγραμματισμό

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

Διαδικαστικός Προγραμματισμός

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

Προγραμματισμός H/Y Ενότητα 5: Συναρτήσεις. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Συστήματα Αυτομάτου Ελέγχου. Ενότητα Α: Γραμμικά Συστήματα

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

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις

ΜΑΘΗΜΑΤΙΚΑ ΓΙΑ ΟΙΚΟΝΟΜΟΛΟΓΟΥΣ

Διαδικαστικός Προγραμματισμός

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

Προγραμματισμός Η/Υ. Συναρτήσεις & Υποπρογράμματα. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

Εισαγωγή στον δομημένο προγραμματισμό

Προγραμματισμός Ι (ΗΥ120)

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Σημειώσεις για πρόοδο στο εργαστήριο

Εισαγωγή στον δομημένο προγραμματισμό

Λογιστικές Εφαρμογές Εργαστήριο

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Εργαστήριο 3 Εντολή for while, do while

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα ΕΠΕΞΕΡΓΑΣΙΑ ΕΙΚΟΝΑΣ. Ενότητα 3: Αποκατάσταση Εικόνας.

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

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

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Αντικειμενοστραφής Προγραμματισμός

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

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις I Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

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

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

7 ο ΕΡΓΑΣΤΗΡΙΟ ΣΗΜΑΤΑ & ΣΥΣΤΗΜΑΤΑ

Τμήμα Μηχανικών Πληροφορικής και Τηλεπικοινωνιών

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

Η γλώσσα προγραμματισμού C

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Εντολές for, while, do-while Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προχωρημένες έννοιες προγραμματισμού σε C

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Η γλώσσα προγραμματισμού C

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

9 ο ΕΡΓΑΣΤΗΡΙΟ ΣΗΜΑΤΑ & ΣΥΣΤΗΜΑΤΑ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Στατιστική Επιχειρήσεων Ι

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

Πληροφορική. Εργαστηριακή Ενότητα 1 η : Εισαγωγή στα Λογιστικά Φύλλα με το MS Excel. Ι. Ψαρομήλιγκος Τμήμα Λογιστικής & Χρηματοοικονομικής

ΣΤΑΤΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΕΩΝ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

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

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΜΑΘΗΜΑΤΙΚΑ ΓΙΑ ΟΙΚΟΝΟΜΟΛΟΓΟΥΣ

ΣΤΑΤΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΕΩΝ

ΣΤΑΤΙΣΤΙΚΗ ΕΠΙΧΕΙΡΗΣΕΩΝ

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις II Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

8 ο ΕΡΓΑΣΤΗΡΙΟ ΣΗΜΑΤΑ & ΣΥΣΤΗΜΑΤΑ

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Transcript:

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα Δομημένος Προγραμματισμός Ενότητα 10: Συναρτήσεις με πίνακες- Αναδρομικές συναρτήσεις Κουκουλέτσος Κώστας Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστικών Συστημάτων

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.

Σκοποί ενότητας Oι διδακτικοί σκοποί της ενότητας είναι οι σπουδαστές: 1. Να χρησιμοποιούν πινάκες σαν παραμέτρους σε συναρτήσεις 2. Να γνωρίσουν τον τρόπο μεταβίβασης πίνακα σε συνάρτηση 3. Να εκτιμήσουν τα οφέλη από την χρήση συναρτήσεων 4. Να γνωρίσουν την φύση των αναδρομικών συναρτήσεων 5. Να κατανοήσουν τα πιθανά μειονεκτήματα από την χρήση αναδρομικών συναρτήσεων 6. Να χρησιμοποιούν αναδρομικές συναρτήσεις στον προγραμματισμό

Περιεχόμενα ενότητας Συναρτήσεις και πίνακες Κλήση συνάρτησης με παράμετρο πίνακα Παράδειγμα συνάρτησης με παράμετρο πίνακα Χρήση συναρτήσεων Αναδρομή Παραγοντικό με αναδρομή Παρατηρήσεις στις αναδρομικές συναρτήσεις Αριθμοί Fibonacci

Συναρτήσεις και πίνακες (1/2) Υπενθυμίζεται ότι στη C το όνομα ενός πίνακα είναι ταυτόχρονα και ένας δείκτης. Π.χ. Τι θα εμφανίσει το παρακάτω πρόγραμμα» int a[ ]={10,20,30,40};» printf("%d %d %d %d %d\n", a,*(a+1),*(a+2),*(a+3),*(a+10));

Συναρτήσεις και πίνακες (2/2) H εμφάνιση του τελευταίου αριθμού οφείλεται στο ότι έχει γίνει υπέρβαση των ορίων του πίνακα. Ένας πίνακας μπορεί να χρησιμοποιηθεί σαν παράμετρος σε μία συνάρτηση. Όμως στην C δεν γίνεται μεταβίβαση όλου του πίνακα αλλά μόνο της διεύθυνσης του πρώτου στοιχείου.

Κλήση συνάρτησης με παράμετρο» int main(void)» { πίνακα (1/5)» int a[10]; //orizetai pinakas»» sinart(a); // kaleitai mia sinartisi. To a exei // thesi deikti»» } Η συνάρτηση sinart, επειδή ο πίνακας a είναι και δείκτης, συνεπώς πρέπει να οριστεί ως» int sinart (int * pa).

Κλήση συνάρτησης με παράμετρο πίνακα (2/5) Ο compiler επιτρέπει να γραφεί ισοδύναμα ο ορισμός της συνάρτησης σαν» int funct ( int pa[ ] ) ή ακόμη και int funct ( int pa[10] ) Έτσι κατανοητό ότι η συνάρτηση καλείται έχοντας έναν πίνακα σαν παράμετρο. Επομένως στον ορισμό των παραμέτρων μίας συνάρτησης μπορεί να γραφεί μία από τις παρακάτω ισοδύναμες δηλώσεις» int funct ( int * pa )» int funct ( int pa[ ] )» int funct ( int pa[10] )

Κλήση συνάρτησης με παράμετρο πίνακα (3/5) Στην πραγματικότητα μόνο μία διεύθυνση θα μεταβιβαστεί προς την συνάρτηση. Η διάσταση του πίνακα που δηλώνεται (εάν δηλώνεται) στις τυπικές παραμέτρους δεν παίζει κανένα ρόλο. Επίσης ο πίνακας, επειδή μεταβιβάζεται μόνο η διεύθυνση του πρώτου στοιχείου του πίνακα, μπορεί να δηλωθεί στον ορισμό και σαν να έχει πλήθος 30» int funct ( int pa[30] ) όμως δεν λαμβάνεται υπόψη το μέγεθος του πίνακα. Όλοι οι προηγούμενοι τρόποι δήλωσης έχουν το ίδιο αποτέλεσμα και δηλώνουν ότι στην κλήση της συνάρτησης ένας πίνακας θα χρησιμοποιηθεί.

Κλήση συνάρτησης με παράμετρο πίνακα (4/5) Υπενθυμίζεται ότι η C δεν κάνει έλεγχο για τα όρια των διαστάσεων σε ένα πίνακα ή εάν το πρόγραμμα θα ξεπεράσει τα όρια που δηλώθηκαν. Επειδή στην ουσία με την κλήση της συνάρτησης που έχει πίνακα σε μία από τις παραμέτρους δεν μεταβιβάζεται πληροφορία για το πλήθος των στοιχείων του πίνακα αυτό γίνεται με χρήση μίας άλλης παραμέτρου που μεταβιβάζει το πλήθος όταν αυτό χρειάζεται.

Κλήση συνάρτησης με παράμετρο πίνακα (5/5) Συμπερασματικά για να χρησιμοποιήσω ένα πίνακα σε μία συνάρτηση σαν παράμετρο πρέπει να περιλαμβάνεται και το μέγεθος του πίνακα Επομένως ο ορισμός της συνάρτησης, εάν ο πίνακας είναι δηλωμένος με int a[10]; θα πρέπει να είναι ένας από τους:» int funct ( int * pa,10 )» int funct ( int pa[ ],10 ) Η κλήση της συνάρτησης από το main γίνεται με την εντολή» sinart(a,10);

Παράδειγμα συνάρτησης με παράμετρο πίνακα (1/4) Το παρακάτω πρόγραμμα διπλασιάζει τα στοιχεία ενός πίνακα:» void changepin(int * pin, int plithos) {» //Kai oi parakato dio tropoi einai apodektoi san dilosi» //void changepin(int pin[10], int plithos)» //void changepin(int pin[60], int plithos)

Παράδειγμα συνάρτησης με παράμετρο πίνακα (2/4)»» int i;» for (i=0;i<plithos;i++){ //diplasiasmos kai emfanisi» pin[i] *=2;» printf("%d ",pin[i]);» }» printf("\n\n");» }

Παράδειγμα συνάρτησης με παράμετρο πίνακα (3/4)» int main( ){» int i, a[10]={1,2,3,4,5,6,7,8,9,10};» for (i=0;i<10;i++) //emfanisi pinaka» printf("%d ",a[i]);» printf("\n\n");

Παράδειγμα συνάρτησης με παράμετρο πίνακα (4/4)» changepin(a,10); //klisi sinartisis» for (i=0;i<10;i++) //emfanisi pinaka» printf("%d ",a[i]);» printf("\n\n");»» return 0;» }

Εύρεση αθροίσματος πίνακα (1/2) Ένας πιο «έξυπνος» τρόπος μεταβίβασης του μεγέθους του πίνακα είναι με την χρήση της συνάρτησης sizeof όπως γίνεται στο παρακάτω παράδειγμα:» int showpin(int pin[ ], int plithos) {» //int showpin(int * pin, int plithos)» //int showpin(int pin[10], int plithos)» //int showpin(int pin[50], int plithos)» int sum=0,i;» for (i=0;i<plithos;i++) printf("%d ",pin[i]);» for (i=0;i<plithos;i++) sum=sum+pin[i];» return sum;» }

Εύρεση αθροίσματος πίνακα (2/2)» int main(int argc, char *argv[]) {» int a[10]={1,2,3,4,5,6,7,8,9,10};» printf("\nto athroisma einai= %d\n",showpin(a,10));» int b[ ]= {100,200,300,400,500,600};» printf("\nto athroisma= %d\n",showpin(b,sizeof(b)/sizeof(int)));»» return 0;» }

Χρήση συναρτήσεων Μέχρι τώρα ίσως δεν έχει γίνει αντιληπτό η χρησιμότητα των συναρτήσεων που ορίζονται από τον προγραμματιστή. Με την χρήση των συναρτήσεων επιτυγχάνεται: Μικρότερος κώδικας (γιατί αποφεύγεται η επανάληψη κώδικα που χρησιμοποιείται σε διαφορετικά τμήματα ενός προγράμματος Δυνατότητα χρήσης της συνάρτησης από άλλα προγράμματα (πχ οι μαθηματικές συναρτήσεις που προσφέρει η C. Καλύτερος έλεγχος του προγράμματος. (Το συνολικό πρόγραμμα διασπάται σε μικρότερα τμήματα που έχουν την δυνατότητα να εκλεχθούν και διορθωθούν πιο εύκολα από τον προγραμματιστή)

Παράδειγμα Να εισάγονται οι βαθμοί δύο τμημάτων που αποτελούνται από 5 και 6 σπουδαστές. Να εμφανίζεται ο μέγιστος βαθμός και ο μέσος όρος του κάθε τμήματος. Ποιο τμήμα πέτυχε τον καλύτερο μέσο όρο. Τέλος να εμφανίζεται το πλήθος των σπουδαστών που πέτυχαν βαθμό ίσο με τον μέγιστο σε κάθε τμήμα.

Παράδειγμα-Λύση (1/4) double average(double v[], int n) { //n einai to plithos sroixeion tou v[] double s = 0.0; int i; for (i = 0; i < n; ++i) s += v[i]; return s / n; } double megistos( double v[], int n) { double max = v[0]; int i; for (i = 0; i < n; ++i) if (max < v[i]) max = v[i]; return max; }

Παράδειγμα-Λύση (2/4) int plithos( double v[], int n) { int pli=0, i; double meg; meg=megistos(v,n); for (i = 0; i < n; ++i) if (v[i] == meg) pli++; return pli; }

Παράδειγμα-Λύση (3/4) int main( ) { double a[6]={6,8.2,10,10,7.5,5.2}; double b[5]={5.2,9.2,9,6.5,9}; double mega,megb,avea,aveb; mega=megistos(a,6); avea=average(a,6); megb=megistos(b,5); aveb=average(b,5); printf("megistos vathmos A tmimatos = %.2f \n",mega); printf("o mesos A tmimatos = %.2f\n\n", avea); printf("megistos vathmos B tmimatos = %.2f \n",megb); printf("o mesos B tmimatos = %.2f\n\n", aveb);

Παράδειγμα-Λύση (4/4) if (avea<aveb) printf("to proto tmima exei kalitero meso \n\n"); else if(avea>aveb) printf("to deftero tmima exei kalitero meso \n\n"); else printf("ta dio tmimata exoyn petixei isous mesous \n\n"); } int plita, plitb; printf("to plithos pou isoutai me to megisto %d\n",plithos(a,6)); printf("to plithos pou isoutai me to megisto %d\n",plithos(b,5)); return 0;

Αναδρομή (recursion) Αναδρομική ( recursive function) είναι μία συνάρτηση που καλεί τον εαυτό της δηλαδή η συνάρτηση αυτή ορίζεται κάνοντας χρήση την ίδια την συνάρτηση. Στα μαθηματικά η δύναμη και το παραγοντικό ορίζονται με αναδρομικές συναρτήσεις: xn=xn-1 x, με x0=1 x!=(x-1)! x, με 0!=1 Κατά επέκταση αναδρομή είναι η τεχνική επίλυσης ενός μεγάλου προβλήματος κάνοντας αναγωγή σε μικρότερα προβλήματα της ιδίας ακριβώς μορφής.

Παραγοντικό με αναδρομή Nα εισάγεται ακέραιος αριθμός n και μετά με χρήση αναδρομικής συνάρτησης να εμφανίζεται το παραγοντικό του αριθμού. Χρήση αναδρομικού τύπου και κλήση της ίδιας συνάρτησης μέσα από την συνάρτηση.

Αναπαράσταση αναδρομικής συνάρτησης

Παρατηρήσεις στις αναδρομικές συναρτήσεις (1/2) Κάθε φορά που γίνεται κλήση συνάρτησης δεσμεύεται χώρος από την μνήμη, και συγκεκριμένα από ένα ειδικό τμήμα που ονομάζεται στοίβα stack. Δέσμευση μνήμης θα σταματήσει όταν αρχίζει να εκτελείται μία συνάρτηση δηλαδή όταν η συνάρτηση δεν καλεί πάλι τον εαυτό της. Σε περίπτωση που γίνεται ένας μεγάλος αριθμός κλήσεων, με αποτέλεσμα να δεσμεύεται μέρος της στοίβας κάθε φορά, και εξαντληθεί η διαθέσιμη μνήμη τότε θα εμφανιστεί το μήνυμα stack overflow.

Παρατηρήσεις στις αναδρομικές συναρτήσεις (2/2) Με την διαδοχική κλήση της ίδιας της συνάρτησης ο χρόνος εκτέλεσης ενός προγράμματος αυξάνεται και μπορεί να γίνει υπερβολικός Οι αναδρομικές συναρτήσεις μπορεί να προσφέρουν κομψές λύσεις σε ένα πρόγραμμα όμως θα πρέπει να χρησιμοποιούνται με προσοχή. Εναλλακτικά μία αναδρομική συνάρτηση μπορεί να υλοποιηθεί με μη αναδρομικό τρόπο με την χρήση επαναληπτικής διαδικασίας. Οπότε, αν ένα πρόβλημα επιλύεται χωρίς ιδιαίτερη δυσκολία, η επαναληπτική διαδικασία είναι προτιμότερη γιατί είναι γρηγορότερη και χωρίς απαιτήσεις σε μνήμη.

Παράδειγμα 1 Να γραφεί συνάρτηση που να επιστρέφει το παραγοντικό ενός αριθμού n χωρίς επανάληψη και να γίνει σύγκριση με το αντίστοιχη συνάρτηση με χρήση αναδρομής: double factorial(int n) { if (n == 0) return(1); else return (factorial(n - 1) * n); } double factloop(int n){ int i; double product = 1; for (i = 1; i <= n; i++) product *= i; return (product); }

Να γραφεί συνάρτηση που να επιστρέφει την δύναμη n ενός αριθμού x με χρήση αναδρομής: Παράδειγμα 2

Aριθμοί Fibonacci (1/2) Οι αριθμοί Fibonacci παράγονται με τον ακόλουθο τρόπο: Οι πρώτοι δύο αριθμοί στην ακολουθία αριθμών Fibonacci είναι οι αριθμοί 0 και 1. Κάθε επόμενος αριθμός παράγεται από το άθροισμα των δύο προηγούμενων Η ακολουθία αριθμών Fibonacci είναι η ακόλουθη: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,..

Aριθμοί Fibonacci (2/2) H αναδρομική συνάρτηση στην γλώσσα C ορίζεται με τον παρακάτω τρόπο:» int Fibonacci(int n){» if ( n == 0 )» return 0;» else if ( n == 1 )» return 1;» else» return ( Fibonacci(n-1) + Fibonacci(n-2) );» }

int Fibonacci(int); Αριθμοί Fibonacci πλήρες πρόγραμμα (1/2) int main(){ int n,i, k; printf("dose to plithos ton arithmon Fibonacci\n"); scanf("%d", &n); printf("\n\nemfanisi seiras arithmon Fibonacci\n"); i=0; for ( k = 0 ; k < n ; k++ ){ printf("%2dos Arithmos= %3d\n",k+1, Fibonacci(i)); i++; }

Αριθμοί Fibonacci πλήρες πρόγραμμα (2/2) return 0; } int Fibonacci(int n){ if ( n == 0 ) return 0; else if ( n == 1 ) return 1; else return ( Fibonacci(n-1) + Fibonacci(n-2) ); }

Τέλος Ενότητας