Η εντολή if x in [a,b,...,c] χρησιμοποιείται μόνο αν η λίστα [a,b,...,c] έχει πεπερασμένο πλήθος στοιχείων;Στην προηγούμενη διάλεξη στο πρόγραμμα που διάβαζε μια ημερομηνία και υπολόγιζε την επόμενη ημερομηνία χρησιμοποιήσαμε την εντολή if month in [4,6,9,11](για τους μήνες που έχουν 30 μέρες).Αν αντί για μήνες είχαμε έναν ακέραιο αριθμό(ή γενικά αν ο χ άνηκε σε ένα σύνολο με άπειρο πλήθος στοιχείων)τι εντολή θα γράφαμε;(Δεν αναφέρομαι σε σύνολα όπως τους άρτιους αριθμούς που θα μπορόυσαμε να γράφαμε if x mod 2=0 κλπ.)
Συζητήσεις για το μάθημα και ανακοινώσεις
if x in [a,b,..,c]
Μια λίστα στην python έχει πεπερασμένο μήκος.
Αν θέλει κάποιος να ελέγξει αν ένα στοιχείο x ανήκει σε ένα άπειρο σύνολο A τότε δεν είναι δυνατόν να αποθηκεύσει κανείς άπειρα στοιχεία στον υπολογιστή του. Πρέπει να έχει ένα διαφορετικό τρόπο να το κάνει. Πρέπει δηλ. να έχει ένα πρόγραμμα (ειδικό για το σύνολο A) που αν του δίνεις το x να σου απαντάει αν το x είναι μέσα ή όχι. Τέτοια προγράμματα δεν υπάρχουν για κάθε άπειρο σύνολο A, ούτε καν για κάθε υποσύνολο των ακεραίων. Ένα τέτοιο σύνολο λέγεται γενικά υπολογίσιμο και είναι γνωστό ότι υπάρχουν σύνολα που δεν είναι υπολογίσιμα.
Αυτά είναι ερωτήματα που ξεφεύγουν από τα πλαίσια ενός μαθήματος προγραμματισμού και εντάσσονται στους τομείς της θεωρία υπολογισμού ή της μαθηματικής λογικής.
Για όσους έχουν το χρόνο και το κέφι να δουν ένα σχετικό ερώτημα, δείτε στο
https://kolount.wordpress.com/2008/04/30/μην-τα-περιμένετε-όλα-από-τη-μηχανή/
Για αυτόν τον λόγο όταν θέμε να δόυμε στην python3 αν x=y δεν κοιτάμε αν x-y=0 αλλά αν abs(x-y)>1e-6;Μετά τίθεται και άλλο ένα ερώτημα εφόσον δεν μπορούμε να αποθηκεύσουμε άπειρους αριθμούς τα προγράμματα μεγίστων και ελαχίστων που είδαμε είναι απολύτως σωστά για όλους τους πραγματικούς αριθμούς x,y;Εννοώ όταν υπάρχουν πάρα πολύ μικρές αποκλίσεις σε άρρητους αριθμούς(π.χ μετά από 100000 ψηφία)τα παραπάνω προγράμματα δεν είναι λάθος;(Οι x,y θα βγαίνουν ίσοι στην εν λόγω περίπτωση;;)
Όχι ακριβώς.
Ένας πραγματικός αριθμός δε μπορεί εν γένει να αναπαρασταθεί ακριβώς μέσα σε πεπερασμένη μνήμη όπως αυτή που έχει ο υπολογιστής (και να είχαμε άπειρη μνήμη για κάποιο λόγο, πάλι θα θέλαμε άπειρο χρόνο για να διαβάσουμε τα άπειρα ψηφία του αριθμού, πόσο μάλλον για να τα επεξεργαστούμε). Αυτός είναι ο λόγος που ούτε η σύγκριση μπορεί να γίνει ακριβώς και επιτρέπουμε πάντα ένα μικρό σφάλμα όταν κοιτάμε αν δύο πραγματικοί αριθμοί είναι ίσοι.
Τα προγράμματα που γράφουμε με πραγματικούς αριθμούς μπορούν λοιπόν να αποτύχουν για κάποιες πολύ κοντινές τιμές πραγματικών αριθμών. Αν π.χ. ψάχνουμε το μέγιστο τριών αριθμών τότε μπορεί, επειδή κάποια πράξη έγινε μόνο κατά προσέγγιση, να βρούμε ένα διαφορετικό αριθμό από τους τρεις που να είναι ο μέγιστος. Αυτό μπορεί να συμβεί αν δύο από τους αριθμούς είναι πολύ κοντά. Ευτυχώς σε αυτή την περίπτωση το ίδιο το μέγιστο θα έχει αλλάξει κατά πάρα πολύ λίγο.