basilis5 Δημοσ. 5 Σεπτεμβρίου 2017 Δημοσ. 5 Σεπτεμβρίου 2017 Καλησπέρα, κάνω τα πρώτα μου βήματα στην java ερχόμενος από συναρτησιακό προγραμματισμό σε mathematica. Για λόγους που δεν είναι της παρούσης, προσπαθώ να υλοποιήσω μια μαθηματική συνάρτηση αλλά έχω δυσκολία. Πρόκειται για άθροισμα όρων σειράς. Στο mathematica αν έχω μια συνάρτηση f(x,y) καλώντας: Sum[f[i, j], {i, 0, 3}, {j, 0, 3}] παίρνω το αποτέλεσμα που θέλω, δλδ f[0, 0] + f[0, 1] + f[0, 2] + f[0, 3] + f[1, 0] + f[1, 1] + f[1, 2] + f[1, 3] + f[2, 0] + f[2, 1] + f[2, 2] + f[2, 3] + f[3, 0] + f[3, 1] + f[3, 2] + f[3, 3] Η υλοποίηση στην java είναι απλή χρησιμοποιώντας 2 for. public static double sumOfDoubleSeries (myClass f, int x_start, int x_end, int y_start, int y_end) { double sum = 0; for (int i = x_start; i <= x_end; i++) { for (int j = y_start; j <= y_end; j++) { sum = sum + f.getValue(i,j); } } return sum; } εδώ έχω μια class myClass, στην οποία έχω ορίσει μια μεθοδο getValue και παίρνω τα ζευγάρια που θέλω καλώντας myClass myInstance = new myClass(); System.out.println(UsefulMethods.sumOfDoubleSeries(myInstance , 0, 10, 0, 9)); Μέχρι εδώ οκ, το θέλα είναι ότι για την δουλειά που την προορίζω, μπορεί να θέλω να γράψω κάτι τέτοιο (mathematica): Sum[f[i, j], {i, 0, 3}, {j, 0, i - 1}] το οποίο μου επιστρέφει όλα τα x>y δλδ: f[1, 0] + f[2, 0] + f[2, 1] + f[3, 0] + f[3, 1] + f[3, 2] Η ερώτηση είναι, μπορώ να γράψω κάπως αλλιώς την μέθοδο sumOfDoubleSeries πιο πάνω έτσι ώστε να παίρνει αντίστοιχα δυναμικά ορίσματα; Ή θα πρέπει κάθε φορά να το κάνω χεράτα, χρησιμοποιώντας διπλές for και όρια αντίστοιχα με τα ζητούμενα μου. Εν ολίγοις προσπαθώ να γράψω την Sum της mathematica (έστω σαν fixed διπλή σειρά).
albNik Δημοσ. 5 Σεπτεμβρίου 2017 Δημοσ. 5 Σεπτεμβρίου 2017 Αν ήταν C# θα σου έλεγα lambda expressions. static double sumOfDoubleSeries(int[][] f, int x_start, int x_end, int y_start, int y_end, Func<int, int, bool> condition=null) { double sum = 0; for(int i = x_start; i <= x_end; i++) { for(int j = y_start; j <= y_end; j++) { if(condition(i, j)) sum = sum + f[i][j]; } } return sum; } και την καλείς έτσι sumOfDoubleSeries(f, 0, 10, 0, 10, (a, => a > ; Δεν ξέρω αν γίνεται με τα lambda expressions της Java 8.
defacer Δημοσ. 5 Σεπτεμβρίου 2017 Δημοσ. 5 Σεπτεμβρίου 2017 Όπως Mathematica γράφεις {j, 0, i - 1} έτσι και στα for σου θα γράψεις for (int i = x_start; i <= x_end; i++) { for (int j = y_start; j <= i - 1; j++) {
basilis5 Δημοσ. 5 Σεπτεμβρίου 2017 Μέλος Δημοσ. 5 Σεπτεμβρίου 2017 σωστα, απλα εψαχνα αν υπαρχει τροπος να γραψω μια συναρτηση οπως η sum της mathematica, που θα επαιρνε καπως στα ορισματα τα {i,0,10}, {j,0,i-1} αντιλαμβανομαι πως ειναι το ιδιο πραγμα, απλα επειδη θα παιξουν διαφορες σειρες, που θα παρουν καθε φορα αλλες τιμες στα ορια, σκεφτομουν αν γινεται να φτιαχει μια μοναδικη μεθοδος.
solarpower Δημοσ. 6 Σεπτεμβρίου 2017 Δημοσ. 6 Σεπτεμβρίου 2017 Δεν έχει eval η java. Αν είχε θα πέρναγε το τύπο σαν αλφαριθμητικό, οπότε μια συνάρτηση θα έπαιζε για διάφορους τύπους. υπάρχουν όμως κάποιοι evaluators δες εδώhttp://www.objecthunter.net/exp4j/
defacer Δημοσ. 6 Σεπτεμβρίου 2017 Δημοσ. 6 Σεπτεμβρίου 2017 σωστα, απλα εψαχνα αν υπαρχει τροπος να γραψω μια συναρτηση οπως η sum της mathematica, που θα επαιρνε καπως στα ορισματα τα {i,0,10}, {j,0,i-1} αντιλαμβανομαι πως ειναι το ιδιο πραγμα, απλα επειδη θα παιξουν διαφορες σειρες, που θα παρουν καθε φορα αλλες τιμες στα ορια, σκεφτομουν αν γινεται να φτιαχει μια μοναδικη μεθοδος. Υπάρχουν τρόποι να γίνει, είτε περνώντας τη συνθήκη για τα ζεύγη i,j που θέλεις (ή ισοδύναμα κάποιο stream για ζεύγη), είτε περνώντας κάποια lambda σαν predicate όπως έδειξε ο albnik. Αλλά αυτό που βλέπεις οπτικά από mathematica δεν μεταφέρεται ως έχει, πρέπει να το γράψεις με τη λογική των εργαλείων που σου παρέχει η γλώσσα. 1
k33theod Δημοσ. 6 Σεπτεμβρίου 2017 Δημοσ. 6 Σεπτεμβρίου 2017 Προσπαθώ να δώσω μια ιδέα με ένα τρόπο που θα το προσέγγιζα εγώ με python και φαντάζομαι ότι υπάρχει κάτι αντίστοιχο σε java Μπορείς λοιπόν σε μία συνάρτηση να περάσεις αριθμό μεταβλητών που μετά καθορίζεις τι κάνουν >>> def f (*args): start_x=args[0] end_x=args[1] start_y=args[2] end_y=end_x+args[3] print(start_x,end_x,start_y,end_y) >>> f(0,5,0,-1) 0 5 0 4 Αν υλοποιήσεις το αντίστοιχο της java πιστεύω κάνεις τη δουλειά σου 1
basilis5 Δημοσ. 6 Σεπτεμβρίου 2017 Μέλος Δημοσ. 6 Σεπτεμβρίου 2017 Προσπαθώ να δώσω μια ιδέα με ένα τρόπο που θα το προσέγγιζα εγώ με python και φαντάζομαι ότι υπάρχει κάτι αντίστοιχο σε java Μπορείς λοιπόν σε μία συνάρτηση να περάσεις αριθμό μεταβλητών που μετά καθορίζεις τι κάνουν >>> def f (*args): start_x=args[0] end_x=args[1] start_y=args[2] end_y=end_x+args[3] print(start_x,end_x,start_y,end_y) >>> f(0,5,0,-1) 0 5 0 4 Αν υλοποιήσεις το αντίστοιχο της java πιστεύω κάνεις τη δουλειά σου αυτό φαίνεται το πιο λογικό έχεις δίκιο, απλα δεν ξερω πως να περασω μεσα strings και ints μαζι. Θα το προσπαθήσω, αν το καταφέρω θα το ποστάρω για reference, ευχαριστω.
k33theod Δημοσ. 7 Σεπτεμβρίου 2017 Δημοσ. 7 Σεπτεμβρίου 2017 αυτό φαίνεται το πιο λογικό έχεις δίκιο, απλα δεν ξερω πως να περασω μεσα strings και ints μαζι. Θα το προσπαθήσω, αν το καταφέρω θα το ποστάρω για reference, ευχαριστω. Τελικά χωρίς την eval δεν ξέρω αν μπορεί να γίνει Με eval αν σε βοηθάει έχω κάνει αυτό >>> def f3 (*args): for i in range(args[0][1],args[0][2]+1): for j in range (eval(str(args[1][1])), eval(str(args[1][2]))+1): print(i,j , end='\t') >>> f3 (('i', 0, 3), ('j', 0, 3)) 0 0 0 1 0 2 0 3 1 0 1 1 1 2 1 3 2 0 2 1 2 2 2 3 3 0 3 1 3 2 3 3 >>> f3 (('i', 0, 3), ('j', 0, 'i-1')) 1 0 2 0 2 1 3 0 3 1 3 2 Εναλλακτικά ίσως θα πρέπει να αλλάξεις τις απαιτήσεις σου για τα ορίσματα ίσως σε κάτι τέτοιο >>> f3(('i', 0, 5), ('j', '+', 1, '-', 2 )) που θα μπορούσε να σημαίνει (i, 0,5), (j, i+1, i-2) και μπορείς ευκολότερα χωρίς την eval να το χειριστείς
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα