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

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

Δημοσ.

Καλησπέρα, κάνω τα πρώτα μου βήματα στην 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 διπλή σειρά).

 

 

 

 

Δημοσ.
Αν ήταν 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.
Δημοσ.

Όπως Mathematica γράφεις {j, 0, i - 1} έτσι και στα for σου θα γράψεις

for (int i = x_start; i <= x_end; i++) {
    for (int j = y_start; j <= i - 1; j++) {
Δημοσ.

σωστα, απλα εψαχνα αν υπαρχει τροπος να γραψω μια συναρτηση οπως η sum της mathematica, που θα επαιρνε καπως στα ορισματα τα {i,0,10}, {j,0,i-1}

 

αντιλαμβανομαι πως ειναι το ιδιο πραγμα, απλα επειδη θα παιξουν διαφορες σειρες, που θα παρουν καθε φορα αλλες τιμες στα ορια, σκεφτομουν αν γινεται να φτιαχει μια μοναδικη μεθοδος.

Δημοσ.

σωστα, απλα εψαχνα αν υπαρχει τροπος να γραψω μια συναρτηση οπως η sum της mathematica, που θα επαιρνε καπως στα ορισματα τα {i,0,10}, {j,0,i-1}

 

αντιλαμβανομαι πως ειναι το ιδιο πραγμα, απλα επειδη θα παιξουν διαφορες σειρες, που θα παρουν καθε φορα αλλες τιμες στα ορια, σκεφτομουν αν γινεται να φτιαχει μια μοναδικη μεθοδος.

 

Υπάρχουν τρόποι να γίνει, είτε περνώντας τη συνθήκη για τα ζεύγη i,j που θέλεις (ή ισοδύναμα κάποιο stream για ζεύγη), είτε περνώντας κάποια lambda σαν predicate όπως έδειξε ο albnik. Αλλά αυτό που βλέπεις οπτικά από mathematica δεν μεταφέρεται ως έχει, πρέπει να το γράψεις με τη λογική των εργαλείων που σου παρέχει η γλώσσα.

  • Like 1
Δημοσ.

Προσπαθώ να δώσω μια ιδέα με ένα τρόπο που θα το προσέγγιζα εγώ με 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 πιστεύω κάνεις τη δουλειά σου

  • Like 1
Δημοσ.

Προσπαθώ να δώσω μια ιδέα με ένα τρόπο που θα το προσέγγιζα εγώ με 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, ευχαριστω.

Δημοσ.

αυτό φαίνεται το πιο λογικό έχεις δίκιο, απλα δεν ξερω πως να περασω μεσα 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 να το χειριστείς

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

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

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

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

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

Σύνδεση

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

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