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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Αναδρομικοί Αλγόριθμοι
Advertisements

Ancient Greek for Everyone: A New Digital Resource for Beginning Greek Unit 4: Conjunctions 2013 edition Wilfred E. Major
H γλώσσα Python H Python είναι μια γλώσσα προγραμματισμού υψηλού επιπέδου γενικής χρήσεως.Οι δημιουργοί της υποστηρίζουν ότι συνδυάζει μεγάλη δύναμη με.
Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές
Γιάννης Σταματίου Μη αποδοτική αναδρομή και η δυναμική προσέγγιση Webcast 8.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 5: Επαναληπτικές και εξωτερικές συναρτήσεις και διαδικασίες Εαρινό εξάμηνο 2009.
ΕΠΑΝΑΛΗΨΗΕΠΑΝΑΛΗΨΗ ΠΡΟΓΡΑΜΜΑΤΑ. ΠΡΟΓΡΑΜΜΑ 1 ΕΞΗΓΗΣΤΕ ΤΙ ΕΞΟΔΟ ΠΑΡΑΓΕΙ ΤΟ ΠΑΡΑΚΑΤΩ ΠΡΟΓΡΑΜΜΑ #include int main() { char ch; int i; float fl; printf("dose.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
Γιάννης Σταματίου Αναδρομή και αναδρομικές σχέσεις
ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΠΟΛΥΜΟΡΦΙΣΜΟΣ. ΑΝΑΚΕΦΑΛΑΙΩΣΗ Θεματολόγιο Κληρονομικότητα Παράδειγμα Κληρονομικότητα – Βελτιωμένο Παράδειγμα Ενθυλάκωση : public – private.
Copyright © 2006 – Quality & Reliability SA PL/SQL TRIGGERS ΜΕΡΟΣ 1.
Αλγόριθμοι - Τμήμα Πληροφορικής ΑΠΘ - 4ο εξάμηνο1 Ανάλυση Αλγορίθμων b Θέματα: Ορθότητα Χρονική αποδοτικότητα Χωρική αποδοτικότητα Βελτιστότητα b Προσεγγίσεις:
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΗΥ Παπαευσταθίου Γιάννης1 Clock generation.
ΗΥ150 – ΠρογραμματισμόςΞενοφών Ζαμπούλης ΗΥ-150 Προγραμματισμός Αναδρομή (1/2)
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό Έλεγχος Ροής - Παραδείγματα Χειμερινό Εξάμηνο 2015.
Μέθοδοι οργάνωσης νοσηλευτικής εργασίας Κατά ασθενή μέθοδος Λειτουργική ή κατά εργασία μέθοδος Ομαδική νοσηλευτική Πρωτοβάθμια νοσηλευτική Προσωπική διευθέτηση.
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Διασύνδεση LAN Γιατί όχι μόνο ένα μεγάλο LAN
Εισαγωγή στον Προγ/μό Η/Υ
Εισαγωγή στην Αριθμητική Ανάλυση Εισαγωγή στη MATLAB
Αρχιτεκτονικη & Γεωμετρια του Παρθενωνα
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Αναπαράσταση αριθμών στον υπολογιστή Σφάλματα
Αρχεσ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ ΤΑξη Β΄
Αλγόριθμοι Εξαγωγής Συμπερασμάτων (Inference Engine)
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Βελτιστοποίηση σε τρίλιζα Καταδίωξη/διαφυγή
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ
ΠΑΙΔΑΓΩΓΙΚΗ ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΘΕΩΡΙΕΣ ΜΑΘΗΣΗΣ Μάριος Κουκουνάρας-Λιάγκης
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Ενότητα Εισαγωγή Είναι εύκολη στη χρήση και στην εκμάθηση.
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
Γίνε ο "ειδικός" στη χρήση ΟΒΑΣΕ
Θεωρητικές Αρχές και Μέθοδοι Ιστορικής Κοινωνιολογίας
ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ: ΔΙΟΙΚΗΣΗ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΜΟΝΑΔΩΝ
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Δομές διακλάδωσης, επαναλήψεις, μέθοδοι
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C
Εισαγωγή στον Προγ/μό Η/Υ
Ποιοί είναι οι δικαστικοί σχηματισμοί του Δικαστηρίου;
Τεχνολογία και Προγραμματισμός Υπολογιστών
ΔΟΜΕΣ ΕΛΕΓΧΟΥ(if-else, switch) και Λογικοί τελεστές / παραστάσεις
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
«Από τη MicroWorlds Pro στην Python»
(ALPHA BANK – EUROBANK – PIRAEUS BANK)
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΔΗΜΙΟΥΡΓΙΚΕΣ ΕΡΓΑΣΙΕΣ Βιωματικό Μέρος
Αναδρομικές Εξισώσεις και Αφηρημένοι Τύποι Δεδομένων
ΗΥ-150 Προγραμματισμός Αναδρομή (1/2).
Οικιακή Οικονομία Α’ Γυμνασίου Μάθημα 6ο. Διδάσκων καθηγητής
Συστήματα Αναμονής (Queuing Systems)
Συναρτήσεις στη C++ ΠΕΡΙΕΧΟΜΕΝΑ Εισαγωγή
aka Mathematical Models and Applications
ΚΑΘΟΔΟΣ ΤΩΝ ΠΕΛΟΠΟΝΝΗΣΟΣ ΕΙΛΩΤΕΣ-ΠΕΡΙΟΙΚΟΙ ΓΕΩΜΕΤΡΙΚΑ ΧΡΟΝΙΑ
Find: ρc [in] from load γT=110 [lb/ft3] γT=100 [lb/ft3]
Class V: Personal Pronouns and 3rd Decl. Cont. (chs )
3Ω 17 V A3 V3.
Δ. ΚΙΟΥΚΙΑΣ, «ΦΟΡΜΕΣ ΔΙΑΚΥΒΕΡΝΗΣΗΣ ΣΤΗΝ ΕΠΟΧΗ ΤΗΣ ΠΑΓΚΟΣΜΙΟΠΟΙΗΣΗΣ»
ΜΥΥ105: Εισαγωγή στον Προγραμματισμό
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΚΠΑΙΔΕΥΤΙΚΗ ΕΡΕΥΝΑ .
Δ. ΚΙΟΥΚΙΑΣ, «ΦΟΡΜΕΣ ΔΙΑΚΥΒΕΡΝΗΣΗΣ ΣΤΗΝ ΕΠΟΧΗ ΤΗΣ ΠΑΓΚΟΣΜΙΟΠΟΙΗΣΗΣ»
Μεταγράφημα παρουσίασης:

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

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

Αναδρομικές συναρτήσεις στα μαθηματικά Παράδειγμα: παραγοντικό 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 «βασική» περίπτωση ζυγός εκθέτης μονός εκθέτης