συναρτηση μεσα σε συναρτηση?

Ξεκίνησε από thanosgn, 08 Μαΐου 2012, 12:21:46 ΜΜ

« προηγούμενο - επόμενο »

thanosgn

Καλημέρα, έχω δει αρκετές συζητήσεις για χρήση σταθερών τιμών στισ παραμέτρους. Θα μπορούσαμε να χρησιμοποιήσουμε μια συνάρτηση σαν παράμετρο π.χ.
f(f(x))
  ή
synart(Α_Μ(χ))
? Φαντάζομαι σε διαδικασία σιγουρα όχι...

petrosp13

Φυσικά και γίνεται

Αν σου δοθεί μια παράσταση που πρέπει να υπολογίζεις την τετραγωνική ρίζα μιας απόλυτης τιμής, δεν θα χρειαστεί να το κάνεις βήμα βήμα, αλλά να γράψεις όλη την έκφραση, καλώντας την μια συνάρτηση με παράμετρο που να εμπεριέχει και την άλλη
Εφόσον δεν υπάρχει αντιγραφή παραμέτρων πίσω, η κλήση κατά τιμή είναι εφικτή
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

thanosgn

και εγώ αυτό πιστεύω. απλά το  :angel:βιβλίο:angel: λεει πως οι παράμετροι πρέπει να είναι μεταβλητές...   :-\

Stefevan

Τι να πει το βιβλίο... ειδικά για τις συναρτήσεις που δεν είναι έτοιμες  :P Τρομάζει κάποιος να μάθει τι είναι η παράμετρος, φαντάσου να του πουν και ότι δέχεται και συνάρτηση σαν παράμετρο  ;D Και να το δούμε στις εξετάσεις  :o

evry

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

Α_Τ(ΛΟΓ(Ε(Χ)))

Συνάρτηση ως παράμετρο έχουμε σε άλλες γλώσσες όπως C, Lisp κλπ.

Φυσικά από την άλλη μπορούμε να ακολουθήσουμε τυφλά το βιβλίο και να παίρνουμε σαν λάθος εντολές του στυλ

Γράψε 2+3+5

What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

gpapargi

Η συνάρτηση μέσα σε συνάρτηση είναι η σύνθεση των συναρτήσεων. Γίνεται υπολογισμός της "μέσα" και η τιμή χρησιμοποιείται στην κλήση της έξω. Ένα ενδιαφέρον ζήτημα που μπορεί να εξηγηθεί με αυτόν τον τροπο είναι το γιατί το 234 υπολογίζεται από αριστερά προς τα δεξιά αν το γράψεις σαν 2^3^4 ενώ υπολογίζεται από δεξιά προς τα αριστερά στα μαθηματικά. Είναι γιατί το θεωρούν σαν την τιμή που παίρνει η σύνθεση της 2x και της 3x στο 4.

Ενδιαφέρον έχει και το αν μπορείς να βάλεις συνάρτηση μέσα σε διαδικασία, δηλαδή την τιμή της συνάρτησης σαν παράμετρο στη διαδικασία. Είναι ισοδύναμο με το αν μπορείς να βάλεις σταθερά σαν παράμετρο στη διαδικασία. Το ενδεχόμενο πρόβλημα είναι ότι κατά την επιστροφή της διαδικασίας θα πρέπει η τιμή επιστροφής να αντιγραφεί πάνω στη σταθερά και αυτό δε γίνεται. Βέβαια στο τετράδιο μαθητή στους πύργους του Ανόι το κάνει, οπότε το δεχόμαστε.

programmer

σε γλωσσα τρεχει κανονικα αν πχ κανεις κληση τετοια: ΚΑΛΕΣΕ Δ1(1,2)
ΔΙΑΔΙΚΑΣΙΑ Δ1(Α,Β)
μεταβλητες
ακεραιες:Α,Β,χ
ΑΡΧΗ
χ<-Α*Β
ΓΡΑΨΕ χ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

petrosp13

Τι σημαίνει "τρέχει κανονικά";
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

programmer

εννοω οτι το δεχεται και δεν σου εμφανιζει μυνημα λαθους.

programmer

Παράθεση από: petrosp13 στις 08 Φεβ 2015, 11:46:52 ΜΜ
Τι σημαίνει "τρέχει κανονικά";
εννοω οτι δεν σου εμφανιζει μυνημα λαθους και σου βγαζει τα σωστα αποτελεσματα.μην ξεχνας πως η διαδικασια δεν επιστρεφει παντα τιμες. στη διαδικασια πρεπει να περιλαμβανει στις παραμετρους τις 2 ειδων πραγματα.1)οτι πρεπει να ξερει για να κανει πραξεις.2)οτι 8ελουμε να μας δωσει πισω.στην προκειμενη περιπτωση 8ελουμε απλα να κανει εναν πολλαπλασιασμο μεταξυ 2 αρι8μων και να εμφανισει το αποτελεσμα. άρα τετοιου ειδους κλήση οχι μονο επιτρέπεται αλλα ειναι η ουσια της διαδικασιας.παιρνει τιμες.είτε μεσω μεταβλητων είτε απευ8είας

ΠΡΟΓΡΑΜΜΑ ασκηση
ΑΡΧΗ
  ΚΑΛΕΣΕ Δ1(2, 4)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ








ΔΙΑΔΙΚΑΣΙΑ Δ1(Α, Β)
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α, Β, χ
ΑΡΧΗ
  χ <- Α*Β
  ΓΡΑΨΕ χ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ


programmer

ενα ακομα παραδειγμα
η διαδικασια λειτουργει ως εξης:αν τις δωσουμε μεταβλητες παιρνει την τιμη τους και επειτα αν αλλαξουν οι αντιστοιχοι παραμετροι στη διαδικασια αλλαζουν και οι αντιστοιχες μεταβλητες στο κυριο προγραμμα.αν ομως δεν τις δωσουμε μεταβλητες αλλα απευθειας σταθερες τοτε απλα κανει τις πραξεις που θελουμε και δεν επιστρεφει τιποτα.ή επιστρεφει μονο οτι της εχουμε δωσει σε μορφη μεταβλητης.πχ ΚΑΛΕΣΕ Δ2(3,2,Χ)
ΔΙΑΔΙΚΑΣΙΑ Δ2(Α,Β,Ε)


ΠΡΟΓΡΑΜΜΑ ασκηση
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: Χ
ΑΡΧΗ
  ΚΑΛΕΣΕ Δ1(2, 4, Χ)
  ΓΡΑΨΕ Χ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ








ΔΙΑΔΙΚΑΣΙΑ Δ1(Α, Β, Δ)
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: Α, Β, Δ
ΑΡΧΗ
  Α <- Α + 2
  Β <- Β + 3
  Δ <- Α*Β
  ΓΡΑΨΕ Δ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

Οι αλλαγές θα γινουν μονο στο χ.στην περιπτωση αυτη θα εμφανιστει το αποτελεσμα στην οθονη:28.00
28.00 δυο φορές μια για το δ και μια για το χ που εχει πλεον την τιμη του δ


programmer

ΠΡΟΓΡΑΜΜΑ ΑΣΚΗΣΑΡΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ
ΑΡΧΗ
  ΚΑΛΕΣΕ ΑΣΚ(Γ(Χ))
  ΓΡΑΨΕ Γ(Χ)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ ΑΣΚ(Φ)
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Φ
ΑΡΧΗ
  Φ <- Φ + 2
  ΓΡΑΨΕ Φ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΣΥΝΑΡΤΗΣΗ Γ(Χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ
ΑΡΧΗ
  Χ <- 54
  Γ <- Χ + 10
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


ΓΡΑΨΕ Γ(Χ) ΤΙΜΗ 64
ΚΑΛΕΣΕ ΑΣΚ(Γ(Χ)) ΤΙΜΗ 66

programmer

Στο καλεσε ασκ(γ(χ)) εκτελειται πρωτα οτι βρισκεται στη συναρτηση γ(χ).επιστρεφεται μια τιμη=64.επειτα καλειται η διαδικασια ασκ(64)ουσιαστικα τωρα πια
αφου η γ(χ) εχει τιμη 64.το 64 μπαινει στο φ και το φ αλλαζει και γινεται 66.ομως δεν επιστρεφει καμια τιμη πισω στη γ(χ)!!!!!αρα στην εντολη του κυρίως προγραμματος ΚΑΛΕΣΕ ΑΣΚ(Γ(Χ)) εμφανιζεται στην ο8ονη η τιμη 66.αντιθέτως στην εντολή γραψε γ(χ) εμφανιζει 64 αφου η γ(χ) δεν εχει αλλαξει!!!
αυτα τα ολίγα για να γνωρίζουμε τι κανουμε με τις συναρτήσεις και τι με τις διαδικασίες γιατι ξέρω αρκετους που είναι λιγο μπερδεμένοι σχετικά με αυτο το θέμα.ελπίζω να βοήθησα κάπως



ΠΡΟΓΡΑΜΜΑ ΑΣΚΗΣΑΡΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ
ΑΡΧΗ
  ΚΑΛΕΣΕ ΑΣΚ(Γ(Χ))
  ΓΡΑΨΕ Γ(Χ)
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΔΙΑΔΙΚΑΣΙΑ ΑΣΚ(Φ)
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Φ
ΑΡΧΗ
  Φ <- Φ + 2
  ΓΡΑΨΕ Φ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

ΣΥΝΑΡΤΗΣΗ Γ(Χ): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Χ
ΑΡΧΗ
  Χ <- 54
  Γ <- Χ + 10
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


ΓΡΑΨΕ Γ(Χ) ΤΙΜΗ 64
ΚΑΛΕΣΕ ΑΣΚ(Γ(Χ)) ΤΙΜΗ 66

evry

#13
(Συνάρτηση πολύ πιο μέσα σε συνάρτηση)

Τι εμφανίζει το παρακάτω πρόγραμμα;
Ποια λειτουργία επιτελεί η συνάρτηση;

ΠΡΟΓΡΑΜΜΑ mesa
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: kamia
ΑΡΧΗ 
  ΓΡΑΨΕ S(100) 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΣΥΝΑΡΤΗΣΗ S(N): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: N
ΑΡΧΗ
  ΑΝ Ν=0 ΤΟΤΕ
      S <- 0
  ΑΛΛΙΩΣ
      S <- N + Σ(Ν-1)
  ΤΕΛΟΣ_ΑΝ  
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ 

ΣΥΝΑΡΤΗΣΗ Σ(N): ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: N
ΑΡΧΗ
  ΑΝ Ν=0 ΤΟΤΕ
      Σ <- 0
  ΑΛΛΙΩΣ
      Σ = N + S(Ν-1)
  ΤΕΛΟΣ_ΑΝ  
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ


η παραπάνω άσκηση δείχνει το βαθμό κατανόησης ενός μαθητή όσον αφορά τη γενικότερη λειτουργία των υποπρογραμμάτων
Νομίζω ότι παρουσιάζει ενδιαφέρον
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

sstergou

Για αμοιβαία αναδρομή μου αρέσει αυτό το παράδειγμα:

Συνάρτηση Άρτιος(ν): Λογική
Μεταβλητές
    Ακέραιες: ν
Αρχή
    Αν ν = 0 τότε
        Άρτιος <- Αληθής
    αλλιώς
        Άρτιος <- Περιττός(ν - 1)
    Τέλος_αν
Τέλος_συνάρτησης

Συνάρτηση Περιττός(ν): Λογική
Μεταβλητές
    Ακέραιες: ν
Αρχή
    Αν ν = 0 τότε
        Περιττός <- Ψευδής
    αλλιώς
        Περιττός <- Άρτιος(ν - 1)
    Τέλος_αν
Τέλος_συνάρτησης