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

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

Δημοσ.

Γεια σας παιδιά.

Έχουμε μάθημα στη σχολή μου C++, και στα λίγα που κάνουμε, κάναμε συναρτήσεις, και απλές εφαρμογές με αναδρομικές συναρτήσεις (υπολογισμός όρου σειράς fibonacci, factorial κτλ).

 

Σε προηγούμενο μάθημα είχαμε προσεγγίσει την νιοστή ρίζα ενός αριθμού S με τον τύπο
x_n+1 = x_n - ((x_n)^m - S)/(m*(x_n)^(m-1)), με loop. Και ελέγχαμε πότε η το ποσοστό απόκλισης ήταν κάτω απο ένα όριο για να τερματίσει.

 

Τωρα έχουμε να την υπολογίσουμε με αναδρομική συνάρτηση που έχει ώς όρισμα τον αριθμό και την τάξη της ρίζας.

 

Έχω σκάσει ρε παιδιά και δε βρίσκω τρόπο. Νομίζω πως μόνο αν βάλω συνάρτηση με τρίτο όρισμα θα μου βγαίνει.

 

Δεν έψαξα στο internet (ακόμα) γιατί δεν ήθελα αν βρω την λύση να ήταν έτοιμη.

Δημοσ.

Γιατί δε σε νιώθω καθόλου;

b*b^(n-1) = b^n

 

Αυτό υπολογίζει την δύναμη του αριθμού, εγώ θέλω την ρίζα.

 

Θα μου πεις βάλε για εκθέτη το 1/n αν θες την n-οστή ρίζα, αλλά μας είπε με τον αναδρομικό τύπο που έγραψα παραπάνω.

 

http://upload.wikimedia.org/math/c/6/f/c6f4669d7e834e662e45b27b78d2add3.png

Δημοσ.

A καλα, δεν δουλευει το κεφαλι μου flik. Θελει 1/ν οπως ειπες αλλα και ο προφεσσορας ειπε τον ιδιο τυπο να τον κανετε recursive. Θα σκεφτω και θα επανελθω.

Δημοσ.

Γενικα σε κάθε αναδρομή εχεις ενα τυπο 

 

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); // ο τυπος σου

    }

}

Δημοσ.

Ναι, όπως και στην 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 σου καλά.

Νομίζω πως με βοήθησες αρκετά για να το βρω. Εϊναι αργά όμως, θα το δω αύριο.

Ευχαριστώ.

Δημοσ.

Οπως στο fib που για να βρεις το fib(5) πρεπει να βρεις τα 4,3,2,1,0

Kαι στο rout το ιδιο σταματάς στο k=1 που το ξερεις ποσο ειναι.

Δημοσ.

Όχι, πάλι κάθισα και το είδα και δεν στέκει.

Εσύ στον αναδρομικό τύπο, κατεβάζεις την τάξη της ρίζας. Δηλαδή λες οτι ο επόμενος όρος με τον προηγούμενο έχει διαφορά στον εκθέτη.

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

Για να υπολογίσεις την 7η ρίζα του 1456 πχ, δεν ξέρεις πόσους όρους θα πάρεις. Δοκιμάζεις μέχρι να έχεις μια απόκλιση (1Ε-10 στο δικό μου παράδειγμα).

Δεν είναι απλά ο 7ος όρος για να πεις ξεκινάω απο τον 7ο, καλώ τον 6ο, που καλεί τον 5ο, κτλ, μέχρι να αναχθεί στον πρώτο που είναι γνωστός.

Αν είναι να ξεκινήσεις απο κάπου, δεν ξέρεις απο πού θα είναι. Αλλά ακόμα και έτσι να ήταν, ο προηγούμενος όρος δεν είναι ο root(x,N-1). Ξέρεις τον πρώτο βέβαια.

 

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

Δημοσ.

Μπερδεύτηκα με το 'νιοστη' και 'xn' (δεν ειναι ιδια)

μαλλον ειναι ετσι

 

x1=S

x2=X1- ((X1n-S)/ (n*X1n-1)

.....

xk+1=Xk- ((Xkn-S)/ (n*Xkn-1)

 

 

 F(float xk )

 {

    xk+1 =  Xk- ((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)

Δημοσ.

Ναι αλλά το S ορίζεται με βάση το x που πάτησε ο χρήστης.

Μετά περνάει ως όρισμα στην συνάρτηση, αλλά κάθε φορά αυτό το όρισμα αλλάζει, γιατί επιστρέφεις την F(x_k+1). Άρα θα πάει το S να γίνει το x_k+1.

Πώς γίνεται να το περάσω μέσα στην συνάρτηση, αλλά να πάρει μια τιμή, και μετά με την επανάκληση της συνάρτησης να μην αλλάξει;

 

Γι' αυτό είχα πει οτι με 3 ορίσματα μπορώ να το σκεφτώ μόνο.

 

Ευχαριστώ.

 

Edit: Να ορίσω την συνάρτηση μέσα στο main για να φαίνεται και εκεί; Αλλά αυτός δεν είναι σωστός προγραμματισμός νομίζω. Δηλαδή αν γίνει έτσι, θα περάσει μέσα στην συνάρτηση ως σταθερά. Αλλιώς αν είναι να οριστεί έξω απο το main, θα πρέπει να περαστεί ως όρισμα, αλλά θα αλλάζει το όρισμα και το S δεν θα είανι το σταθερό που θέλουμε.

Δημοσ.

Τα S ,n λογικα δεν αλλαζουν , μπορεις να τα περνας στην F αλλα δεν πρεπει να μεταβαλλεις τις τιμες τους.

 

F(float S, int n, float xk)

{

  ....

}

 

αρχικα καλεις F(S, n, S)  

 

Πώς γίνεται να το περάσω μέσα στην συνάρτηση, αλλά να πάρει μια τιμή, και μετά με την επανάκληση της συνάρτησης να μην αλλάξει;

 

Το δηλώνεις static μεσα στην συναρτηση.

Δημοσ.

Μισό λεπτό. Επειδή το static δεν το γνωρίζω.

Αν χρησιμοποιήσω static πάλι πρέπει να έχω 3 ορίσματα; Η άσκηση μας έδωσε να χρησιμοποιήσουμε την συνάρτηση:

root(double x, int N).

Γίνεται με 2 ορίσματα αν την δηλώσω static; Ή πάλι θέλει 3;

Δημοσ.

Πέτυχε!

Ευχαριστώ πάρα πολύ. Είχα σκεφτεί κάτι σε constant που το είχαμε δει στο μάθημα, αλλά δεν έγινε.

 

Να 'σαι καλά. Είχα σπάσει το κεφάλι μου πραγματικά.

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

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

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

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

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

Σύνδεση

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

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