Ανακύκλωση

Η εντολή 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.

Η μεταβλητή 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)

Μελέτη

Βιβλιογραφία
  1. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python, (Κεφάλαιο 3).
  2. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016) - Κεφάλαιο 5. Επανάληψη με την εντολή while.
  3. Style Guide for Python Code.