Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

προσπαθώ να κάνω βελτιστοποίηση στον κώδικα μου, οπου τρέχω αναδρομικές συναρτήσεις.

Ψαχνοντας λοιπον έπεσα στον παρακάτω τρόπο γραφής της fibonacci, που εχει ενα ενδιαφερον, αλλα δεν μπορω να καταλαβω ακριβώς την συνταξη της και πως δουλευει, για να την εφαρμοσω σε δευτερη φαση στην δικη μου πιο συνθετη συναρτηση.

 

παραθετω τον κωδικα που βρηκα στο stackexchange

fib2[0]=0;
fib2[n_]:=Module[{f},
   f[n,p1_,_]:=p1;
   f[x_,p1_,p2_]:=f[x+1,p1+p2,p1];
   f[1,1,0]
]

Γνωριζει κανεις να μου πει τι ακριβως γίνεται μεσα στην module;

Η λογικη διαισθητiκα μου φαινεται αναποδη απο την λογικη που θα εγραφε κανεις

f[x_]:=f[x-1]+f[x-2]
Δημοσ.

 

προσπαθώ να κάνω βελτιστοποίηση στον κώδικα μου, οπου τρέχω αναδρομικές συναρτήσεις.

Ψαχνοντας λοιπον έπεσα στον παρακάτω τρόπο γραφής της fibonacci, που εχει ενα ενδιαφερον, αλλα δεν μπορω να καταλαβω ακριβώς την συνταξη της και πως δουλευει, για να την εφαρμοσω σε δευτερη φαση στην δικη μου πιο συνθετη συναρτηση.

 

παραθετω τον κωδικα που βρηκα στο stackexchange

fib2[0]=0;
fib2[n_]:=Module[{f},
   f[n,p1_,_]:=p1;
   f[x_,p1_,p2_]:=f[x+1,p1+p2,p1];
   f[1,1,0]
]

Γνωριζει κανεις να μου πει τι ακριβως γίνεται μεσα στην module;

Η λογικη διαισθητiκα μου φαινεται αναποδη απο την λογικη που θα εγραφε κανεις

f[x_]:=f[x-1]+f[x-2]

Καλημέρα.

Αν παρατηρήσεις, θα δεις ότι μέσα στην Module (που μπαίνει για λόγους locality των εμπλεκομένων μεταβλητών), στην ουσία ορίζει όχι μόνο τον γενικό αναδρομικό τύπο (όπως θα έκανες και εσύ), αλλά και τις αρχικές συνθήκες.

Π.χ. εγώ θα έγραφα:

f[n_] := (f[0] = a; f[1] = b; If[n >= 2, f[n - 1] + f[n - 2], Print["Ill-defined"]])

Φυσικά, στις αρχικές συνθήκες, μπορείς να βάλεις ό,τι θες -αρκεί να τροποποιήσεις καταλλήλως την συνθήκη μέσα στην If.

Δημοσ.

Το θέμα είναι πως ο αρχικοσ τρόπος γράφεις είναι σημαντικά γρηγοροτεροσ από τον τρόπο που ορίζεις την f και που κ εγώ έτσι θα έγραφα. Ακόμα κ χρησιμοποιώντας memoiazation.

Δημοσ.

Το να οριστεί η f ως 

f[x_]:=f[x-1]+f[x-2]

ή

f[n_] := ( f[0] = a; f[1] = b; If[n >= 2, f[n - 1] + f[n - 2], Print["Ill-defined"]] )

είναι πολύ διαισθητικό διότι εφαρμόζει άμεσα τον μαθηματικό ορισμό.

Ωστόσο, από άποψη προγραμματιστικής απόδοσης είναι χείριστο διότι κάνει αναδρομικά επικαλυπτόμενες πράξεις

και υπολογίζει πάρα πολλές φορές τα ίδια πράγματα, άσκοπα. Γι αυτό είναι τόσο αργός ο υπολογισμός.

Είναι κλασσικό παράδειγμα όπου πρέπει να ΜΗΝ εφαρμόζεται αναδρομή.

 

Ο ορισμός με την module αποφεύγει αυτό το πράγμα.

 

-

Δημοσ.

O ορισμος σε module απλα οριζει τοπικα την f.

εγω ρωταω αν καποιος μπορει να μου εξηγησει αυτες τις 3 γραμμες.

 

f[n,p1_,_]:=p1;
f[x_,p1_,p2_]:=f[x+1,p1+p2,p1];
f[1,1,0]]

πιο πριν εχει δωσει στην fib2 αρχικη τιμη για 0 .

Απο εκει και περα, οριζει την f τοπικα, και στην 3η μεταβλητη αφηνει μια απλη κατω παυλα. Και ολο αυτο ισο με p1.

Στην συνεχεια την ξαναοριζει με 3 μεταβλητες, αλλα γιατι λεει πως 

 

f[x...]=f[x+1,...]

και οχι το αναποδο, που διαισθητικα θα ειναι νοημα, οτι ο επομενως ορος δλδ (χ+1) εξαρταται απο τον προηγουμενο (χ),

και τελος απλα καλει την [1,1,0] που κατα καποιο τροπο δινει για n=1 αρχικη τιμη επισης 1. Γιατι την δινει ετσι, κι οχι πχ απεξω οπως εκανε στην fib2.

 

Αυτα προσπαθω να καταλαβω.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...