Τετάρτη, Νοεμβρίου 28, 2007

Scheme: Μάθημα Δευτέρας 26/11/2007

Μεταφέρω τις ασκήσεις που κάναμε την περασμένη Δευτέρα.

1.


(define (oura x y)
(cond ((> x y)
'End)
((<= x y)
(display " ")
(display x)
(oura (+ 1 x) y))))


που μας δίνει (για x=1 και y=20):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20End


2.

(define (oura2 x y)
(cond ((> x y)
'End)
((<= x y)
(oura2 (+ 1 x) y)
(display " ")
(display x))))


που μας δίνει (για x=1 και y=20):
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

*Από εδώ και κάτω αλλάξαμε το 'End με => (display "End")

3.

(define (oura3 x y)
(cond ((> x y)
(display "End"))
((<= x y)
(oura3 (+ 1 x) y)
(display " ")
(display x))))


που μας δίνει (για x=1 και y=20):
End 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

4.

(define (oura4 x y)
(cond ((> x y)
(display "End"))
((<= x y)
(oura4 (+ 1 x) y)
(display " ")
(display x)
(oura4 (+ 1 x) y))))


που μας δίνει (για x=1 και y=20):
άλλ' αντί άλλων (αλλά το κάνουμε για εκπαιδευτικούς σκοπούς)

5.

(define (oura5 x y)
(cond ((> x y)
(display "End"))
((<= x y)
(display " ")
(display x)
(oura5 (+ 1 x) y)
(display " ")
(display x))))


που μας δίνει (για x=1 και y=20):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20End 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Αυτά από μένα.
Για περεταίρω εξήγηση του τι σημαίνουν όλα αυτά θα μπορούσα να προσπαθήσω να τη δώσω, αλλά το αφήνω στους πληροφορικάριους ;)

3 σχόλια:

fertility hollis είπε...

λοιπόν,μήπως μπορεί να εξηγήσει κάποιος με ποιά λογική στην ουρά 2 (oura2) οι αριθμοί κατατάσσονται ανάποδα; εντάξει,τη πρώτη τη καταλαβαίνω,αλλά για τη δεύτερη...για παράδειγμα καταλαβαίνω στο δεύτερο μέρος της δεύτερης ουράς "αν το χ είναι μεγαλύτερο η ίσο του ψ ,τρέξε την ουρά2 για χ+1 και ψ, τύπωσε κενό και μετά τύπωσε χ" πάλι με άυξουσα σειρά δε θα πρεπε να τυπωθεί;
ζητώ τα φώτα σας ;)
-Ζήτω!

Shipwrecked Frontier Pioneer είπε...

Αυτό που θα πρέπει να θυμάσαι είναι ότι μια συνάρτηση σταματά την εκτέλεσή της (δηλαδή ολοκληρώνεται αυτό που λέμε κλήση της συνάρτησης) όταν τελειώσει η εκτέλεση και της τελευταίας εντολής. Προφανές θα μου πεις, αλλά στην περίπτωση που μια συνάρτηση καλεί μια άλλη (στην προκειμένη περίπτωση, τον εαυτό της) είναι εύκολο να το ξεχάσουμε:

Όταν εκτελεστεί πρώτη φορά η oura, δημιουργείται ένα αντίγραφό της στη μνήμη (συνήθως το λέμε instance, οπότε ας το πούμε Ι1). Όταν η oura καλέσει τον εαυτό της θα δημιουργηθεί ένα δεύτερο αντίγραφο Ι2. Το οποίο θα καλέσει ένα τρίτο αντίγραφο Ι3, κοκ.

Όταν δημιουργηθεί το Ι2 (δηλαδή, όταν η oura καλέσει τον εαυτό της), το Ι1 παγώνει την εκτέλεσή του και περιμένει να επιστρέψει αποτέλεσμα το Ι2. Το Ι2 θα παγώσει και αυτό την εκτέλεσή του και θα περιμένει να επιστρέψει αποτέλεσμα το Ι3.

Όταν φτάσουμε στη συνθήκη εξόδου (δηλαδή, όταν κληθεί το (oura 21)), το Ι21 δεν καλεί τον εαυτό του, απλά τυπώνει "End" και οι κλησεις θυγατρικών instances σταματούν. Όταν εκτελεστεί και τελειώσει το Ι21, μόνο τότε τελειώνει το Ι20, οπότε μετά τελειώνει το Ι19, μετά το Ι18, κοκ.


Μέχρι εδώ ήταν ο εισαγωγή. Τώρα η απάντηση:

Η διαφορά στην oura και στην oura2 είναι ότι η oura πρώτα τυπώνει το x και μετά καλεί τον εαυτό της, ενώ η oura2 το αντίστροφο.

Το αποτέλεσμα αυτής της μικρής διαφοράς είναι ότι η oura τυπώνει το x μεταξύ των κλήσεων του εαυτού της. Δηλαδή, η εκτέλεσή της πάει ως εξής: Κάλεσε το Ι1, Τύπωσε το x (1), Κάλεσε το Ι2, Τύπωσε το x (2), Ι3, x (3), Ι4.

Αντίθετα, η oura2 αρχίζει να καλεί τον εαυτό της πριν ακόμα τυπώσει οτιδήποτε. Έτσι, όταν το Ι1 δημιουργήσει το Ι2 υπάρχουν ακόμα εντολές που δεν έχουν εκτελεστεί (το κομμάτι
(display " ")
(display x)).

Ομοίως, το Ι2 καλεί το Ι3, κοκ, και τις υπόλοιπες εντολές θα τις εκτελέσει όταν τελειώσει το θυγατρική της instance.

Μόνο όταν εκτελεστεί το Ι21, θα μπορέσει το Ι20 να εκτελέσει τις υπόλοιπες εντολές και να τυπώσει το x (20), οπότε θα εκτελεστεί με τη σειρά της η υπόλοιπη Ι19 και θα τυπώσει το x (19), κοκ.


Οι υπόλοιπες συναρτήσεις στα παραδείγματα συνδιάζουν αυτές τις δύο περιπτώσεις. Για παράδειγμα, το oura5 τυπώνει το x πριν και μετά την κλήση του εαυτού του και έτσι μας δίνει μια εικόνα για την πορεία των instances. Το oura3 είναι στην ουσία ίδιο με το oura2, αλλά η αλλαγή του 'End σε (display "End") διορθώνει την τάση της Scheme για πρωτοβουλίες (Το αλλάξαμε επειδή δεν ήθελε να τυπώσει το End, δεν έχω ιδέα γιατί αρνείται).
Το oura4 απλά δεν την παλεύει, αλλά έχει πλάκα να πειραματίζεσαι στον προγραμματισμό για να δεις πώς θα αντιδράσει το πρόγραμμα (βέβαια, το αν και κατά πόσο έχει πλάκα είναι υποκειμενικό, μάλλον μόνο οι καμμένοι κουμπάκηδες αρέσκονται σε τέτοιες αντικοινωνικές συμπεριφορές).

Σε μπέρδεψα αρκετά;
:P

amalia είπε...

Χίλια ευχαριστούμε για τη μεταφορά των ασκήσεων!
(Δεν έχω προλάβει ακόμα να ασχοληθώ για να γράψω και τις δικές μου απορίες...)

Πάμε τελικά να διαψεύσουμε τον Σταματάκη σχετικά με τους μεταπτυχιακούς φοιτητές που πλακώνονται!! Εμείς θα είμαστε το πιο αγαπημένο και συνεργατικό τμήμα που πέρασε. Φαίνεται ότι το blog φτιάχνει καλούς συνεργάτες:
blog: σας φέρνει πιο κοντά!