ΜΥΥ105: Εισαγωγή στον Προγραμματισμό

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Κεφάλαιο Τμηματικός προγραμματισμός
Advertisements

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΥΠΟΡΟΥΤΙΝΕΣ
Αλγόριθμοι Αναζήτησης
POINTERS, AGGREGATION, COMPOSITION. POINTERS TO OBJECTS.
Βήματα στην εκτέλεση μιας διαδικασίας (procedure) 1.Τοποθέτηση παραμέτρων 2.Μεταβίβαση ελέγχου στη διαδικασία 3.Λήψη πόρων αποθήκευσης.
Να καταργήσουμε τη ΓΛΩΣΣΑ και να κρατήσουμε μόνο την ψευδογλώσσα
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Προγραμματισμός Ι Παράδειγμα: Παράδειγμα:Να γραφεί πρόγραμμα που να δέχεται ως είσοδο κείμενο, να απαριθμεί τις εμφανίσεις των ψηφίων 0-9, τα λευκά διαστήματα.
Γιάννης Σταματίου Μη αποδοτική αναδρομή και η δυναμική προσέγγιση Webcast 8.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 5: Επαναληπτικές και εξωτερικές συναρτήσεις και διαδικασίες Εαρινό εξάμηνο 2009.
Διακριτά Μαθηματικά ΙI Αναδρομή
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις.
Η ΓΛΩΣΣΑ C ΜΑΘΗΜΑ 2.
Σχεδίαση αλγορίθμων (2ο μέρος)
Διδάσκων: Παύλος Παυλικκάς1 Ολυμπιάδα Πληροφορικής Recursion - Αναδρομή.
1 Ολυμπιάδα Πληροφορικής Μάθημα 7. 2 Στόχοι μαθήματος Δημιουργία συναρτήσεων από το χρήστη Δομή προγράμματος με συναρτήσεις Συναρτήσεις και παράμετροι.
HY Γλώσσες και Μεταφραστές Φροντιστήριο Runtime Environment.
ΣΥΝΑΡΤΗΣΕΙΣ.
Ψηφιακά Δένδρα TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AA A A A Μπορούμε να χρησιμοποιήσουμε την παραπάνω αναπαράσταση.
ΗΥ302 Διδακτική της Πληροφορικής Η γλώσσα προγραμματισμού LOGO Writer Ομάδα Εργασία: Αλεβίζου Βασιλική (Α.Μ.:1029) Κοφφινά Ιωάννα (Α.Μ.:1035) Τριανταφυλλίδου.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
2-1 Ανάλυση Αλγορίθμων Αλγόριθμος Πεπερασμένο σύνολο εντολών που, όταν εκτελεστούν, επιτυγχάνουν κάποιο επιθυμητό αποτέλεσμα –Δεδομένα εισόδου και εξόδου.
Γιάννης Σταματίου Αναδρομή και αναδρομικές σχέσεις
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
Quicksort Διδάσκοντες: Σ. Ζάχος, Δ. Φωτάκης Επιμέλεια διαφανειών: Δ. Φωτάκης Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο.
Εθνικό και Καποδιστριακό Πανεπιστήμιο Αθηνών – Τμήμα Πληροφορικής και Τηλεπικοινωνιών 1 Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας Προπτυχιακό.
Κεφάλαιο 10 – Υποπρογράμματα
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - 4ο εξάμηνο1 Ανάλυση Αλγορίθμων b Θέματα: Ορθότητα Χρονική αποδοτικότητα Χωρική αποδοτικότητα Βελτιστότητα b Προσεγγίσεις:
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Copy Constructor Deep and Shallow Copies.
1 ΤΜΗΜΑ ΜΠΕΣ Αλγόριθμοι Αναζήτησης Εργασία 1 Τυφλή Αναζήτηση.
Δομές Δεδομένων 1 Θέματα Απόδοσης. Δομές Δεδομένων 2 Οργανώνοντας τα Δεδομένα  Η επιλογή της δομής δεδομένων και του αλγορίθμου επηρεάζουν το χρόνο εκτέλεσης.
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις.
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές.
HY Γλώσσες και Μεταφραστές Φροντιστήριο Runtime Environment.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
Οι εντολές επανάληψης Σε πολλά προβλήματα απαιτείται η επανάληψη ενός συνόλου ενεργειών προκειμένου να λυθεί το πρόβλημα. Θα αναφέρουμε δύο χαρακτηριστικά.
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Συναρτήσεις (μέρος δεύτερο) και Μεταβλητές.
2) Aν δανειστούμε ένα ποσό Α με επιτόκιο Τ=Ε% και υποχρεωθούμε να το ξεχρεώσουμε σε Ν χρόνια, τότε το ποσό της μηνιαίας δόσης Μ θα δίνεται από τον τύπο.
Σχεδίαση Αλγορίθμων - Τμήμα Πληροφορικής ΑΠΘ - 4ο εξάμηνο1 Ανάλυση Αλγορίθμων b Θέματα: Ορθότητα Χρονική αποδοτικότητα Χωρική αποδοτικότητα Βελτιστότητα.
Εισαγωγή στην Έννοια του Αλγορίθμου και στον Προγραμματισμό
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα.
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
Αντικειμενοστραφής Προγραμματισμός Ι
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Δυναμικός Κατακερματισμός
ΑΛΓΟΡΙΘΜΟΣ ΠΡΟΒΛΗΜΑ ΑΛΓΟΡΙΘΜΟΣ ΛΥΣΗ
Συναρτήσεις.
ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Βελτιστοποίηση σε τρίλιζα Καταδίωξη/διαφυγή
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
ΣΥΝΑΡΤΗΣΕΙΣ (Functions)
ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ «ΓΙΑ» Για μτ από ατ μέχρι ττ [με_βήμα β] εντολές Τέλος_επανάληψης : περιοχή εντολών μτ : η μεταβλητή της.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Η Γλώσσα Pascal Υποπρογράμματα
Εισαγωγή στον Προγ/μό Υπολογιστών
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Δυναμικός Προγραμματισμός
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ Η/Υ
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Εισαγωγή στις Αρχές της Επιστήμης των Η/Υ
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Ενότητα Γ7.3.8(Προβλήματα Ακολουθιακής Δομής )
Δυναμικός Κατακερματισμός
Αναδρομή Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:
Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου
Μεταγράφημα παρουσίασης:

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

Ορισμός και ιδιότητες Μια συνάρτηση είναι αναδρομική αν καλεί τον εαυτό της Οι περισσότερες γλώσσες προγραμματισμού υποστηρίζουν αναδρομικές συναρτήσεις Οι αναδρομικές συναρτήσεις είναι πολλές φορές πιο διαισθητικές από τις αντίστοιχες επαναληπτικές Η εκσφαλμάτωσή τους είναι όμως δυσκολότερη, οπότε πρέπει να χρησιμοποιούνται με προσοχή Επίσης οι αναδρομικές συναρτήσεις μπορεί να επιβαρύνουν τη μνήμη του συστήματος και να είναι πιο αργές

Αναδρομικές συναρτήσεις στα μαθηματικά Παράδειγμα: παραγοντικό def fact(n): if n==0 or n==1: return 1 else: return n*fact(n-1) «βασική» περίπτωση def fact(n): f = 1 for i in range(1,n+1): f *= i return f επαναληπτική συνάρτηση: αναδρομική περίπτωση

Παράδειγμα: ύψωση σε δύναμη def power(x, n): if n == 0: return 1 else: return x * power(x, n-1) αναδρομική συνάρτηση: def power(x, n): result = 1 for i in range(n): result *= x return result επαναληπτική συνάρτηση:

Παράδειγμα: αριθμοί Fibonacci Μια ακολουθία αριθμών: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,... Ορίζονται με την αναδρομική συνάρτηση: Χρήσεις και εμφάνιση: Μαθηματικα: συνδεση με τη χρυσή τομή Φύση: διακλαδώσεις δέντρων, διάταξη φύλλων, κλπ.

Παράδειγμα: αριθμοί Fibonacci def rfib(n): if n==1 or n==2: return 1 else: return rfib(n-1)+rfib(n-2) αναδρομική συνάρτηση: def fib(n): if n<=1: return -1 # undefined p = 1 # first number c = 1 # second number for i in range(n-2): # c becomes p, compute new c p, c = c, p +c return c επαναληπτική συνάρτηση: p (previous) = προηγούμενος αριθμός c (current) = τρέχων αριθμός

Αναδρομικές συναρτήσεις σε γλώσσα προγραμματισμού Πιο περίπλοκες από τις μαθηματικές αναδρομές Μπορούν να δημιουργήσουν προβλήματα αν δεν οριστούν σωστά Άσκηση: Τι κάνει η παρακάτω συνάρτηση; Ποιο είναι το πρόβλημα της παρακάτω συνάρτησης; Πως θα φτιάξουμε το πρόβλημα; Η «βασική» περίπτωση ορίζει τη συνθήκη τερματισμού def countdown(n): print(n) countdown(n-1) def countdown(n): print(n) if n==0: print('blast off!'); return countdown(n-1)

Αναδρομικές συναρτήσεις σε γλώσσα προγραμματισμού def countdown(n): print(n) if n==0: print('blast off!'); return countdown(n-1) countdown(0) print(0) print('blast off!')) countdown(3) print(3) countdown(2) countdown(2) print(2) countdown(1) countdown(1) print(1) countdown(0) Η Python δημιουργεί μια «στοίβα» όπου κρατάει τη «μνήμη» για κάθε αναδρομική κλήση: τοπικές μεταβλητές σημείο της συνάρτησης από το οποίο πρέπει να συνεχίσει μετά την επιστροφή από την αναδρομική κλήση

Αναδρομικές συναρτήσεις σε γλώσσα προγραμματισμού Το παράδειγμά μας εξακολουθεί να έχει προβλήματα: Αν καλέσουμε countdown(-1) η συνάρτηση δεν τερματίζει Αν καλέσουμε countdown(10000) το πρόγραμμα θα «κολλήσει» μετά από περίπου 1000 κλήσεις αναδρομής ... η «στοίβα» του προγράμματος θα γεμίσει RuntimeError: maximum recursion depth exceeded def countdown(n): print(n) if n==0: print('blast off!'); return countdown(n-1)

Σκεπτόμενοι αναδρομικά Άσκηση: φτιάξτε μια αναδρομική συνάρτηση vertical, η οποία να τυπώνει τα ψηφία ενός αριθμού «κάθετα» από το περισσότερο στο λιγότερο σημαντικό Επιθυμητή συμπεριφορά: >>> vertical(3124) 3 1 2 4

Σκεπτόμενοι αναδρομικά Βήμα 1: ποια είναι η «βασική» περίπτωση; αν ο αριθμός έχει ένα μόνο ψηφίο, απλά τύπωσε το ψηφίο άρα η συνάρτησή μας πρέπει να έχει τη μορφή: >>> vertical(6) 6 def vertical(n): if n<10: # base case: n has 1 digit print(n) # just print n else: # recursive case: n has 2 or more digits # remainder of function

Σκεπτόμενοι αναδρομικά Βήμα 2: ποια είναι η «αναδρομική» περίπτωση; αν ο αριθμός έχει περισσότερα από ένα ψηφία (=n), τότε σπάσε τον σε δύο μέρη: στο τελευταίο ψηφίο σε όλα τα υπόλοιπα μαζί (δηλ. τα πρώτα n-1 ψηφία) π.χ. το 3124 σπάει σε 312 και 4 πρώτα χρειριζόμαστε τα πρώτα ψηφία (υποπρόβλημα), μετά το τελευταίο ψηφίο τα πρώτα n-1 ψηφία μπορούν να τυπωθούν με τη σωστή σειρά με μια αναδρομική κλήση ο χειρισμός του τελευταίου ψηφίου είναι η «βασική» περίπτωση

Σκεπτόμενοι αναδρομικά def vertical(n): if n<10: # base case: n has 1 digit print(n) # just print n else: # recursive case: n has 2 or more digits vertical(n//10) # recursively print all but last digit print(n%10) # print last digit of n >>> vertical(3124) 3 1 2 4 vertical(3124) vertical(312) print(4) vertical(31) print(2) vertical(3) print(1) print(3)

Άσκηση Τι κάνει η παρακάτω συνάρτηση; def vertical(n): if n<10: # base case: n has 1 digit print(n) # just print n else: # recursive case: n has 2 or more digits print(n%10) # print last digit of n vertical(n//10) # recursively print all but last digit >>> vertical(3124) 4 2 1 3

Σκεπτόμενοι αναδρομικά Άσκηση: φτιάξτε μια αναδρομική συνάρτηση pattern που να τυπώνει αστεράκια όπως στα παρακάτω παραδείγματα >>> pattern(3) * ** *** >>> pattern(0) >>> pattern(1) * >>> pattern(2) * **

Σκεπτόμενοι αναδρομικά Βήμα 1: ποια είναι η «βασική» περίπτωση; αν το όρισμα είναι 0, μήν κάνεις τίποτα άρα η συνάρτησή μας πρέπει να έχει τη μορφή: >>> pattern(0) >>> def pattern(n): if n==0: return # base case for n=0 else: # recursive case: n>0 # remainder of function

Σκεπτόμενοι αναδρομικά Βήμα 2: ποια είναι η «αναδρομική» περίπτωση; με ανάλυση της επιθυμητής συμπεριφοράς και λίγη σκέψη... >>> pattern(1) * >>> pattern(2) * ** >>> pattern(3) * ** *** 1 φορά ‘*’ pattern(0) pattern(1) pattern(2) 2 φορές ‘*’ pattern(1) 3 φορές ‘*’ pattern(2)

Σκεπτόμενοι αναδρομικά def pattern(n): if n==0: return # base case for n=0 else: # recursive case: n>0 pattern(n-1) # recursively print pattern for n-1 print(n*'*') # print n stars

Πόσο γρήγορη είναι η συνάρτησή μας; Όταν σχεδιάζουμε μια συνάρτηση, πρέπει να σκεφτόμαστε και την ταχύτητά της Η συνάρτηση rfib είναι πολύ πιο αργή από τη fib def rfib(n): if n==1 or n==2: return 1 else: return rfib(n-1)+rfib(n-2) αναδρομική συνάρτηση: def fib(n): if n<1: return -1 # undefined p = 1 # first number c = 1 # second number for i in range(n-2): # c becomes p, compute new c p, c = c, p +c return c επαναληπτική συνάρτηση:

Πόσο γρήγορη είναι η συνάρτησή μας; Άσκηση: όταν εκτελούμε τη fib(7) πόσες επαναλήψεις εκτελούνται; Η fib(n) χρειάζεται περίπου n επαναλήψεις Άρα ο χρόνος της fib(n) είναι ανάλογος του n def fib(n): if n<1: return -1 # undefined p = 1 # first number c = 1 # second number for i in range(n-2): # c becomes p, compute new c p, c = c, p +c return c επαναληπτική συνάρτηση:

Πόσο γρήγορη είναι η συνάρτησή μας; Άσκηση: όταν εκτελούμε την rfib(7) πόσες φορές εκτελείται η rfib(3); def rfib(n): if n==1 or n==2: return 1 else: return rfib(n-1)+rfib(n-2) αναδρομική συνάρτηση: H rfib κάνει τους ίδιους υπολογισμούς πολλές φορές!

Πόσο γρήγορη είναι η συνάρτησή μας; Άσκηση: μελετήστε την παρακάτω συνάρτηση και σκεφτείτε πως μπορούμε να την κάνουμε πιο γρήγορη def my_pow(base, exponent): value = 1 for i in range(0, exponent): value *= base return value >>> my_pow(1.00000001,100000000) 2.71828179834636 >>> 1.00000001**100000000 2.7182817983473577

Πόσο γρήγορη είναι η συνάρτησή μας; Λύση: πως μπορούμε να ορίσουμε τη συνάρτηση my_pow αναδρομικά; an = an/2*an/2 αν ο n είναι ζυγός αν είναι μονός; an = a*an/2*an/2 και στις 2 περιπτώσεις το an/2 χρειάζεται να υπολογιστεί μόνο 1 φορά Πόσες αναδρομικές κλήσεις απαιτούνται για τον υπολογισμό του an; περίπου log2n

Πόσο γρήγορη είναι η συνάρτησή μας; def my_pow(base, exponent): if exponent==0: # base case return 1 tmp = my_pow(base, exponent//2) if exponent % 2 == 0: return tmp*tmp else: return base*tmp*tmp «βασική» περίπτωση ζυγός εκθέτης μονός εκθέτης