flik Δημοσ. 6 Δεκεμβρίου 2013 Δημοσ. 6 Δεκεμβρίου 2013 Γεια σας παιδιά. Έχουμε μάθημα στη σχολή μου C++, και στα λίγα που κάνουμε, κάναμε συναρτήσεις, και απλές εφαρμογές με αναδρομικές συναρτήσεις (υπολογισμός όρου σειράς fibonacci, factorial κτλ). Σε προηγούμενο μάθημα είχαμε προσεγγίσει την νιοστή ρίζα ενός αριθμού S με τον τύποx_n+1 = x_n - ((x_n)^m - S)/(m*(x_n)^(m-1)), με loop. Και ελέγχαμε πότε η το ποσοστό απόκλισης ήταν κάτω απο ένα όριο για να τερματίσει. Τωρα έχουμε να την υπολογίσουμε με αναδρομική συνάρτηση που έχει ώς όρισμα τον αριθμό και την τάξη της ρίζας. Έχω σκάσει ρε παιδιά και δε βρίσκω τρόπο. Νομίζω πως μόνο αν βάλω συνάρτηση με τρίτο όρισμα θα μου βγαίνει. Δεν έψαξα στο internet (ακόμα) γιατί δεν ήθελα αν βρω την λύση να ήταν έτοιμη.
Anubis13 Δημοσ. 6 Δεκεμβρίου 2013 Δημοσ. 6 Δεκεμβρίου 2013 if (n == 0) { return 1; } else { return base * powerN(base, n - 1); } Οριστε
flik Δημοσ. 6 Δεκεμβρίου 2013 Μέλος Δημοσ. 6 Δεκεμβρίου 2013 Γιατί δε σε νιώθω καθόλου; b*b^(n-1) = b^n Αυτό υπολογίζει την δύναμη του αριθμού, εγώ θέλω την ρίζα. Θα μου πεις βάλε για εκθέτη το 1/n αν θες την n-οστή ρίζα, αλλά μας είπε με τον αναδρομικό τύπο που έγραψα παραπάνω. http://upload.wikimedia.org/math/c/6/f/c6f4669d7e834e662e45b27b78d2add3.png
Anubis13 Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 A καλα, δεν δουλευει το κεφαλι μου flik. Θελει 1/ν οπως ειπες αλλα και ο προφεσσορας ειπε τον ιδιο τυπο να τον κανετε recursive. Θα σκεφτω και θα επανελθω.
albNik Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 Γενικα σε κάθε αναδρομή εχεις ενα τυπο xk+1=F(xk)=F(F(xk-1)) = ... F(F(F(..x1))) και μια αρχική συνθήκη x1=x (η ριζα με "εκθετη" 1) η F ειναι κάπως έτσι float F(int k) { if(k==1) return A; else { float xx=F(k-1) return xx- (xx^n -A)/(n*xx^n-1); // ο τυπος σου } }
flik Δημοσ. 7 Δεκεμβρίου 2013 Μέλος Δημοσ. 7 Δεκεμβρίου 2013 Ναι, όπως και στην fibonacci fib(N) είχα βάλει if (N=0||N=1) return N; //γιατί αυτοί είναι οι πρώτοι δύο όροι else return fib(n-1)+fib(n-2) Αλλά εδώ, ο πρώτος όρος συνήθως ξεκιναει ίσος με το υπόρριζο, αλλά εμείς δεν ξέρουμε μέχρι ποιον όρο θα βρούμε. Δηλαδή όταν θέλουμε παραγοντικό ξέρουμε θα πάρουμε μέχρι τον 6 όρο (αν θέλουμε 6!), με πρώτο όρο το 1. Εδώ έχω 2 προβλήματα. 1)Δεν μπορώ να εκφράσω τον τελευταίο όρο με βάση ένα απο τα ορίσματα. Και έτσι δεν μπορώ να έχω την συνθήκη συναρτήσει των ορισμάτων. 2)Δεν μπορώ να εκφράσω τον πρώτο όρο με βάση ένα απο τα ορίσματα. Και είναι πρόβλημα γιατί η αναδρομή δουλεύει με τα ορίσματα. Σωστά; Edit: Τώρα διάβασα όλο το post σου καλά. Νομίζω πως με βοήθησες αρκετά για να το βρω. Εϊναι αργά όμως, θα το δω αύριο. Ευχαριστώ.
albNik Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 Οπως στο fib που για να βρεις το fib(5) πρεπει να βρεις τα 4,3,2,1,0 Kαι στο rout το ιδιο σταματάς στο k=1 που το ξερεις ποσο ειναι.
flik Δημοσ. 7 Δεκεμβρίου 2013 Μέλος Δημοσ. 7 Δεκεμβρίου 2013 Όχι, πάλι κάθισα και το είδα και δεν στέκει. Εσύ στον αναδρομικό τύπο, κατεβάζεις την τάξη της ρίζας. Δηλαδή λες οτι ο επόμενος όρος με τον προηγούμενο έχει διαφορά στον εκθέτη. Ενώ ο τύπος υπολογισμού παίρνει τον ίδιο αριθμό και προσθέτει έναν όρο (αρνητικό όρο) και τον βάζει σε νέα τιμή. Για να υπολογίσεις την 7η ρίζα του 1456 πχ, δεν ξέρεις πόσους όρους θα πάρεις. Δοκιμάζεις μέχρι να έχεις μια απόκλιση (1Ε-10 στο δικό μου παράδειγμα). Δεν είναι απλά ο 7ος όρος για να πεις ξεκινάω απο τον 7ο, καλώ τον 6ο, που καλεί τον 5ο, κτλ, μέχρι να αναχθεί στον πρώτο που είναι γνωστός. Αν είναι να ξεκινήσεις απο κάπου, δεν ξέρεις απο πού θα είναι. Αλλά ακόμα και έτσι να ήταν, ο προηγούμενος όρος δεν είναι ο root(x,N-1). Ξέρεις τον πρώτο βέβαια. Τέλος πάντων, μπορεί να μη καταλαβαίνω επειδή είναι βράδυ. Συνήθως τις εργασίες τις έκανα σε 10 λεπτά το πολύ, αυτή μου έφαγε πολύ πολύ παραπάνω.
albNik Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 Μπερδεύτηκα με το 'νιοστη' και 'xn' (δεν ειναι ιδια) μαλλον ειναι ετσι x1=S x2=X1n - ((X1n-S)/ (n*X1n-1) ..... xk+1=Xkn - ((Xkn-S)/ (n*Xkn-1) F(float xk ) { xk+1 = Xkn - ((Xkn-S)/ (n*Xkn-1) if(|xk+1 - Xk|<0.0000001) return xk+1; else return F( xk+1) } n ειναι η ριζα S o αριθμος k τα βηματα Και ξεκινας με F(S)
flik Δημοσ. 7 Δεκεμβρίου 2013 Μέλος Δημοσ. 7 Δεκεμβρίου 2013 Ναι αλλά το S ορίζεται με βάση το x που πάτησε ο χρήστης. Μετά περνάει ως όρισμα στην συνάρτηση, αλλά κάθε φορά αυτό το όρισμα αλλάζει, γιατί επιστρέφεις την F(x_k+1). Άρα θα πάει το S να γίνει το x_k+1. Πώς γίνεται να το περάσω μέσα στην συνάρτηση, αλλά να πάρει μια τιμή, και μετά με την επανάκληση της συνάρτησης να μην αλλάξει; Γι' αυτό είχα πει οτι με 3 ορίσματα μπορώ να το σκεφτώ μόνο. Ευχαριστώ. Edit: Να ορίσω την συνάρτηση μέσα στο main για να φαίνεται και εκεί; Αλλά αυτός δεν είναι σωστός προγραμματισμός νομίζω. Δηλαδή αν γίνει έτσι, θα περάσει μέσα στην συνάρτηση ως σταθερά. Αλλιώς αν είναι να οριστεί έξω απο το main, θα πρέπει να περαστεί ως όρισμα, αλλά θα αλλάζει το όρισμα και το S δεν θα είανι το σταθερό που θέλουμε.
albNik Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 Τα S ,n λογικα δεν αλλαζουν , μπορεις να τα περνας στην F αλλα δεν πρεπει να μεταβαλλεις τις τιμες τους. F(float S, int n, float xk) { .... } αρχικα καλεις F(S, n, S) Πώς γίνεται να το περάσω μέσα στην συνάρτηση, αλλά να πάρει μια τιμή, και μετά με την επανάκληση της συνάρτησης να μην αλλάξει; Το δηλώνεις static μεσα στην συναρτηση.
flik Δημοσ. 7 Δεκεμβρίου 2013 Μέλος Δημοσ. 7 Δεκεμβρίου 2013 Μισό λεπτό. Επειδή το static δεν το γνωρίζω. Αν χρησιμοποιήσω static πάλι πρέπει να έχω 3 ορίσματα; Η άσκηση μας έδωσε να χρησιμοποιήσουμε την συνάρτηση: root(double x, int N). Γίνεται με 2 ορίσματα αν την δηλώσω static; Ή πάλι θέλει 3;
albNik Δημοσ. 7 Δεκεμβρίου 2013 Δημοσ. 7 Δεκεμβρίου 2013 Πιστευω γινεται, απ ότι ξερω διατηρεί την πρωτη τιμη. root(double x, int n) { static double S=x; ..... }
flik Δημοσ. 7 Δεκεμβρίου 2013 Μέλος Δημοσ. 7 Δεκεμβρίου 2013 Πέτυχε! Ευχαριστώ πάρα πολύ. Είχα σκεφτεί κάτι σε constant που το είχαμε δει στο μάθημα, αλλά δεν έγινε. Να 'σαι καλά. Είχα σπάσει το κεφάλι μου πραγματικά.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα