Ανακύκλωση
Η εντολή while
Η εντολή αναλύκλωσης while
περιγράφει μία επαναληπτική διαδικασία
και το συντακτικό της είναι:
while expression:
statements
Οι εντολές statements εκτελούνται εφόσον η έκφραση expression είναι αληθής. Ο τρόπος ομαδοποίησης των εντολών ανακύκλωσης statements είναι πάλι η εσοχή (tab).
Ένα πρώτο παράδειγμα:
max = int(input("Give a positive integer: "))
i = 0
while i < max:
i = i + 1
print(i)
print(i)
Εύρεση ρίζας θετικού αριθμού με τον αλγόριθμο του Ήρωνα.
x = input("Give a number")
x = float(x)
g = 1.0 # first approximation
while abs(g*g - x) > 1.0e-5:
g = (g+x/g)/2.0
print("The square root of",x,"is approximately",g)
Εύρεση κυβικής ρίζας τέλειου κύβου με εξαντλητική απαρίθμηση.
perfect_cube = 216 # this is a perfect cube
x = 0
while x**3 < perfect_cube:
x = x + 1
if x**3 < perfect_cube:
print("No,", x,"is not the cubic root of",perfect_cube)
elif x**3 == perfect_cube:
print("Yes, indeed!", x,"is the cubic root of",perfect_cube)
Συμβολοσειρές. Μπορούμε να εξαγάγουμε έναν-έναν τους χαρακτήρες μιας συμβολοσειράς.
s = input("Give a string: ")
i = 0
while i < len(s):
print(i,"character is",s[i])
i = i + 1
Παρατήρηση: η εντολή iter += 1
είναι ισοδύναμη με την iter = iter + 1
. Γενικότερα, η x += y
είναι ισοδύναμη με την x = x + y
.
Επίσης υπάρχουν και οι τελεστές -=, *=, /=, //=. **= με ανάλογες σημασίες.
Εντολή break
Μπορούμε να τερματίσουμε μία ανακύκλωση πρόωρα με την εντολή break
.
s = input("Give a string: ")
i = 0
while i < len(s):
if s[i] == 'o':
print("The character o is in position",i)
i = i + 1
if i == len(s):
print("There is no o in the word", s)
Η εντολή break
είναι απαραίτητη στις ατέρμονες ανακυκλώσεις.
while True:
x = int(input("Input a number between 1 and 100: "))
if x >= 1 and x <= 100:
break
print("Well done!")
Εντολή continue
Οι εντολές της ανακύκλωσης δεν εκτελούνται και η ανακύκλωση επαναλαμβάνεται
όταν υπάρχει η εντολή continue
.
iter = 0
summ = 0
while iter < 10:
x = int(input('Enter a positive integer: '))
if x <= 0:
continue
summ = summ + x
iter = iter + 1
print('The sum is', sum)
Ανακύκλωση με την εντολή for
Η εντολή ανακύκλωσης while
, ορισμένες φορές, εκτελεί κάποιες εντολές όταν ένας μετρητής,
η λεγόμενη μεταβλητή της ανακύλωσης, παίρνει τιμές από μια ακολουθία ακεραίων.
Για παράδειγμα, μπορούμε να τυπώσουμε τα τετράγωνα των ακεραίων από το 1 έως το 10.
i = 1
while i < 10:
print('The square of', i, 'is', i**2)
i += 1
Για να σαρώσουμε επαναληπτικά μία ακολουθία ακεραίων υπάρχει ένας δεύτερος τρόπος στην python με τη χρήση της εντολής for
.
for i in range(0,10):
print('The square of', i, 'is', i**2)
range. Η συνάρτηση range(start,end)
παράγει μία ακολουθία ακεραίων από το start
έως το end-1
.
Η γενική μορφή της συνάρτησης είναι range(start,end,step)
και κατασκευάζει
την αριθμητική πρόοδο start, start+step, start+2*step,...,start+n*step
.
- Αν
step>0
τότε στην παραπάνω ακολουθία οstart+n*step
είναι ο μεγαλύτερος ακέραιος μικρότερος από τονend
. - Αν
step<0
τότε οstart+n*step
είναι ο μικρότερος ακέραιος μεγαλύτερος από τονend
. - Αν το
start
παραληφθεί τότεstart=0
. Αν τοstep
παραληφθεί τότεstep=1
.
Η μεταβλητή i
που εμφανίζεται μετά τη λέξη-κλειδί for
λαμβάνει διαδοχικά τις τιμές της ακολουθίας range(0,max)
και η εντολή print(i)
εκτελείται.
Η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας.
in. Δείτε τον τελεστή in
με τον οποίο ελέγχουμε κατά πόσο η μεταβλητή i
είναι μέλος της ακολουθίας range(0,max)
.
Το συντακτικό της εντολής for
είναι
for variable in sequence:
statements
Ο τελεστής in
ελέγχει κατά πόσο η μεταβλητή variable είναι μέλος της ακολουθίας sequence.
Οι εντολές statements εκτελούνται και η διαδικασία επαναλαμβάνεται μέχρι να εξαντληθούν οι τιμές της ακολουθίας,
ή μια εντολή break
τερματίσει πρόωρα την ανακύκλωση.
Παράδειγμα. Για την εύρεση κυβικής ρίζας (τέλειου κύβου, έστω n) με εξαντλητική απαρίθμηση σαρώσαμε μία σειρά ακεραίων από το 1 έως το πολύ n.
pc = int(input("Give an integer: "))
for x in range(0,pc):
if x**3 != abs(pc):
print("The cubic root of",pc,"is",x)
break
Μία βελτίωση του παραπάνω προγράμματος είναι η ακόλουθη (σκεφτείτε γιατί αυτό αποτελεί βελτίωση).
pc = int(input("Give an integer: "))
for x in range(0,abs(pc)+1):
if x**3 >= abs(pc):
break
if x**3 != abs(pc):
print(pc,"is not a perfect cube")
else:
if pc < 0:
x = -x
print("The cubic root of",pc,"is",x)
strings ως ακολουθίες χαρακτήρων
Οι μεταβλητές τύπου string είναι ακολουθίες χαρακτήρων και μπορούμε να γράψουμε εντολές ανακύκλωσης που τυπώνουν έναν-έναν τους χαρακτήρες μιας ακολουθίας χαρακτήρων:
s = 'Nick Papadakis'
for c in s:
print(c)
Πιο εκτεταμένες ασκήσεις στην ανακύκλωση
Εύρεση κυβικής ρίζας τέλειου κύβου με εξαντλητική απαρίθμηση (μία σημαντική βελτίωση παλαιότερου κώδικα).
perfect_cube = int(input("Give an integer: "))
x = 0
while x**3 < abs(perfect_cube):
x = x + 1
if x**3 != perfect_cube:
print(perfect_cube,"is not a perfect cube")
else:
if perfect_cube < 0:
x = -x
print("The cubic root of", perfect_cube,"",x)
Μέθοδος διχοτόμησης [Δείτε J.V. Guttag (Παράγραφος 3.3)]. Για την αναζήτηση προσέγγισης τατραγωνικής ρίζας αριθμού.
Έστω $x > 1$ τότε γνωρίζουμε ότι $1 < \sqrt{x} < x$.
Θα αρχίσουμε περιορίζοντας τη λύση στο διάστημα $[0,x]$ και θα διχοτομούμε το διάστημα
ώσπου να πετύχουμε μία συγκεκριμένη ακρίβεια της προσέγγισης (epsilon
).
x = 2;
epsilon = 1.0e-3
numGuesses = 0
low = 1; high = x;
mid = (low + high)/2.0
while abs(x - mid**2) >= epsilon:
print('low =', low, 'high =', high, 'Approximation =', mid)
numGuesses += 1
if mid**2 < x:
low = mid
else:
high = mid
mid = (low + high)/2.0
print('Number of iterations = ',numGuesses)
print('The square root of',x,'is approximately', mid)
Μελέτη
Βιβλιογραφία- J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python, (Κεφάλαιο 3).
- Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Κεφάλαιο 5. Επανάληψη με την εντολή while.
- Style Guide for Python Code.