Στην άσκηση αυτή θα συμπληρώσετε τον κώδικα Python που βρίσκεται στο αρχείο hw2.py, ακολουθώντας τις ίδιες οδηγίες (δείτε και εδώ) με αυτές που δόθηκαν στη Σειρά Ασκήσεων 1.

Στην αρχή του hw2.py δίνεται ο ορισμός της συνάρτησης sum_sequence την οποία μπορείτε να χρησιμοποιείτε σε εκφράσεις κλήσης στις απαντήσεις σας (χωρίς όμως να την αλλάξετε).

def sum_sequence(n, term):
    """A8roisma arxikwn orwn akolou8ias                                                      
    n -- deikths teleutaiou orou (deikths prwtou = 1)               
    term -- synarthsh: term(i) einai o i-ostos oros                 

    Epistrefei tin timi term(1) + term(2) + ... + term(n).          
    """
    i, sum = 2, term(1)
    while i <= n:
        sum += term(i)
        i += 1
    return sum

 

Έλεγχος ορθότητας

Η βαθμολόγηση των ασκήσεων θα βασιστεί σε ελέγχους ορθότητας παρόμοιους με αυτούς που περιέχονται στο αρχείο hw2_tests.txt που βρίσκεται στα έγγραφα του eclass.

Για να εκτελέσετε τους ελέγχους από τη γραμμή εντολών των Windows δώστε:

> python -m doctest -v hw2_tests.txt

Σε unix/Linux ή MacOS γράψτε στο shell:

> python3 -m doctest -v hw2_tests.txt

(Σιγουρευτείτε ότι τρέχετε την εντολή αυτή από κατάλογο που περιέχει τόσο hw2.py όσο και το hw2_tests.py.)

 

Τρόπος παράδοσης:

Θα παραδώσετε το αρχείο hw2.py.

  1. Οι φοιτητές που έχουν εγγραφεί στο eclass θα παραδόσουν την εργασία από εκεί.
  2. Οι φοιτητές που δεν έχουν εγγραφεί στο eclass θα την παραδώσουν με email στο dimakis@aueb.gr με θέμα (subject): [2025 - ΑΣΚΗΣΗ 2] (με τις αγκύλες) που επίσης περιέχει το ονοματεπώνυμο τους στο σώμα του μηνύματος και σε σχόλιο μέσα στο hw2.py.

 

 

Άσκηση 1

Συμπληρώστε τα κενά (_______) του κώδικα ώστε η digit_sum(x) να επιστρέφει το άθροισμα των ψηφίων του x. (Υπόδειξη: η έκφραση x % 10 είναι ίση με το δεξιότερο ψηφίο του x, ενώ η x // 10 μετακινεί τα ψηφία του x κατά μια θέση προς τα δεξιά.)

def digit_sum(x):
"""Ypologizei to a8roisma twn (dekadikwn) pshfiwn tou x

x -- 8etikos akeraios

>>> digit_sum(10000)
1
>>> digit_sum(615)
12
>>> digit_sum(23) == 5
True
"""
s = ________
while ________:
s = __________
x = __________

return ________

 

 

Άσκηση 2

Συμπληρώστε τα κενά (_________) στον κώδικα της alternating_sum_100 ώστε η κλήση alternating_sum_100() να επιστρέφει το αποτέλεσμα του αθροίσματος  1 - 2 + 3 - 4 + ... + 99 - 100.

def alternating_sum_100():
"""1 - 2 + 3 - 4 + ... + 99 - 100
>>> alternating_sum_100()
-50
>>> alternating_sum_100() == -50
True
"""
______________________
______________________
return sum_sequence(_______________, ____________________________)

 

 

Άσκηση 3

Συμπληρώστε τα κενά _________ στον κώδικα της alternating_sequence_sum_100 ώστε η κλήση alternate_sequence_sum_100(term) να επιστρέφει το αποτέλεσμα του αθροίσματος  term(1) - term(2) + term(3) - term(4) + ... + term(99) - term(100), για οποιαδήποτε συνάρτηση term που δέχεται ένα αριθμητικό όρισμα και επιστρέφει αριθμό.

def alternating_sequence_sum_100(term):
"""Epistrefei term(1) - term(2) + term(3) -...+ term(99) - term(100)
>>> alternating_sequence_sum_100(lambda x: x)
-50
>>> alternating_sequence_sum_100(lambda x: (-1)**x * x)
-5050
>>> alternating_sequence_sum_100(lambda x: 1)
0
"""
______________________
______________________
return sum_sequence(_______________, ____________________________)

 

 

Άσκηση 4

Συμπληρώστε τα κενά _________ στον κώδικα της alternating_sum_squares_100 ώστε η κλήση alternating_sum_100() να επιστρέφει το αποτέλεσμα του αθροίσματος  12 - 22 + 32 - 42 + ... + 992 - 1002.

def alternating_sum_squares_100():
"""
>>> alternating_sum_squares_100()
-5050
>>> alternating_sum_squares_100() == -5050
True
"""
return alternating_sequence_sum_100(_____________________________)

 

 

Άσκηση 5

Συμπληρώστε τον κώδικα της reverse_args ώστε η κλήση reverse_args(f), όπου f συνάρτηση δύο ορισμάτων, να επιστρέφει συνάρτηση που κάνει τον ίδιο υπολογισμό με την f όπου δέχεται τα ορίσματα σε αντίστροφη σειρά, δηλ., f(x, y) έχει την ίδια τιμή με τη reverse_args(f) (y, x).

def reverse_args(f):
""" Antistrefei ta orismata.

-- f synartisi 2 orismatwn

Epistrefei synartisi g opou i klisi g(x, y) exei idia timi me tin f(y, x).

Paradeigmata:
>>> pow(2, 3)
8
>>> pow(3, 2)
9
>>> wop = reverse_args(pow)
>>> wop(2, 3)
9
>>> wop(3, 2)
8
"""
""" GRAPSTE TON KWDIKA SAS APO KATW """

 

 

Άσκηση 6

Δώστε αναδρομική υλοποίηση της συνάρτησης sum_sequence.

 

def sum_sequence(n, term):
    """A8roisma arxikwn orwn akolou8ias                                                      
    n -- deikths teleutaiou orou (deikths prwtou = 1)               
    term -- synarthsh: term(i) einai o i-ostos oros                 

    Epistrefei tin timi term(1) + term(2) + ... + term(n).
>>> sum_sequence_rec(1, lambda x: x)
1
>>> sum_sequence_rec(3, lambda x: x)
6
>>> sum_sequence_rec(3, lambda x: x**2)
14
>>> sum_sequence_rec(100, lambda x: x**2)
338350     
    """
    """ GRAPSTE TON KWDIKA SAS APO KATW """
    """PREPEI NA LEITOYRGEI ANADROMIKA, XWRIS ENTOLES
    EPANALHPSHS OPWS while, for.
    """

 

 

Άσκηση 7

Συμπληρώστε το σώμα της print_digits ώστε η κλήση print_digits(x) να εμφανίζει τα ψηφία του θετικού ακέραιου x ένα ένα σε μια γραμμή το κάθε ένα, αρχίζοντας από το πιο σημαντικό (αριστερότερο) ψηφίο.

Η υλοποίηση πρέπει να γίνει με αναδρομικό υπολογισμό χωρίς να χρησιμοποιηθούν εντολές επανάληψης όπως while και for.  

def print_digits(x):
    """Emfanizei ta pshfia ari8mou.

   
x -- 8etikos akeraios >= 0

    Emfanizei ena ena ta pshfia tou x arxizontas
    apo to pio simantiko pshfio.

    Paradeigmata:
    >>> print_digits(0)
    0
    >>> print_digits(2019)
    2
    0
    1
    9
    >>> print_digits(923884)
    9
    2
    3
    8
    8
    4
    """
    """ GRAPSTE TON KWDIKA SAS APO KATW """
    """PREPEI NA LEITOYRGEI ANADROMIKA, XWRIS ENTOLES
    EPANALHPSHS OPWS while, for.
    """