_gladiator_ Δημοσ. 16 Αυγούστου 2013 Δημοσ. 16 Αυγούστου 2013 Έστω ότι κατά τη διάρκεια εκτέλεσης του προγράμματος θέλουμε να δημιουργήσουμε εμφωλευμένους βρόχους, αλλά ο αριθμός τους είναι άγνωστος.Ψάχνοντας στο internet, βρήκα ότι μάλλον πρέπει να χρησιμοποιηθεί αναδρομή, αλλά δεν βρήκα κάποιο παράδειγμα συγκεκριμένο.Για να το κάνω πιο συγκεκριμένο:Έστω οι παρακάτω εμφωλευμένοι βρόχοι:for(int i=0;i<s0;i++){for(int j=0;j<s1;j++){for(int k=0;k<s2;k++){for(int w=0;w<s3;w++){...// Κάνε κάτι με τα i, j, k, w, ...}}}}Πώς θα δημιουργήσουμε μία μέθοδο που να δημιουργεί n εμφλευμένους βρόχους;void nNestedLoops(int n){...}
Technology fan Δημοσ. 16 Αυγούστου 2013 Δημοσ. 16 Αυγούστου 2013 έστω ότι θέλεις 10 for οπότε δηλώνεις πίνακα 10 θέσεων Α[10] με δείκτες (i,j,k,w) ορίζεις την αρχή S[10] και το τέλος Ε[10] for i=1 εως 10 for A=S εως Ε do sth end end Δεν είναι ακριβώς εμφωλευμένα αλλά ενδεχομένως να μπορείς να το κάνεις με αυτό το τρόπο. Εξαρτάται και τι θέλεις να κάνεις, Γενικά πρώτη φορά βλέπω κάποιον να το ζητά αυτό, δεν μπορώ να σκεφτώ κάποια εφαρμογή. Ενδιαφέρον όμως... edit: δεν είναι ανάδραση, αλλά αναδρομή. Για αυτό δε κατάλαβα... void nNestedLoops(int n) { if (n>0){ // πραξεις // και μετά κλήση συνάρτησης με μειωμένο όρισμα nNestedLoops(n-1); } }
_gladiator_ Δημοσ. 16 Αυγούστου 2013 Μέλος Δημοσ. 16 Αυγούστου 2013 Έχεις δίκιο, αυτό ήθελα να γράψω και άλλο έγραψα!!!
_gladiator_ Δημοσ. 17 Αυγούστου 2013 Μέλος Δημοσ. 17 Αυγούστου 2013 @Technology fan Μπορείς να γίνεις πιο συγκεκριμένος;
Directx Δημοσ. 17 Αυγούστου 2013 Δημοσ. 17 Αυγούστου 2013 Ίσως θα ήταν καλύτερα να σκεφτείς μια διαφορετική προσσέγιση (όπως του "Technology fan") στο ζητούμενο, διαφορετικά ψάξε το JavaCompiler class ή/και το Java Reflection API.
Technology fan Δημοσ. 17 Αυγούστου 2013 Δημοσ. 17 Αυγούστου 2013 Ας πούμε οτι θέλεις να τρέξεις το παρακάτω Δηλαδή 4 εμφωλευμένα loop: for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { for(int k=0;k<10;k++) { for(int w=0;w<10;w++) { sum=sum+i+j+k+w; } } } } Μπορείς να το κάνεις χρησιμοποιώντας τη συνάρτηση void nestedloop(int times,int sum) { if (n>0){ for (i=0;i<10;i++){ sum=sum+i; nestedloop(times-1,sum); // klisi sinartisis } } και κάνοντας την κλήση ως nestedloop(4,0); Δεν θα βγάλουν το ίδιο αποτέλεσμα διότι η nestedloop είναι void και το sum δεν αποθηκεύεται όταν τελειώνει η κλήση της συνάρτησης οπότε θα πρέπει να το τροποποιήσεις λίγο για να γίνεται κλήση με διεύθυνση μνήμης. Επειδή η java δεν υποστηρίζει δείκτες θα πρέπει να εκμεταλλευτείς τις κλάσεις και τα αντικείμενα για να το πετύχεις. Αν το γραφα σε c θα ταν πιο εύκολα. Πιστεύω όμως μπορείς να καταλάβεις την λογική! Τώρα, αν κάθε index σου έχει διαφορετική αρχή και τέλος (επειδή εγώ θεώρησα 0 εως 9 για να το κάνω εύκολο) κάνεις το κολπάκι που είπα στην αρχή με τους πίνακες. 1
_gladiator_ Δημοσ. 21 Αυγούστου 2013 Μέλος Δημοσ. 21 Αυγούστου 2013 Αν τα index έχουν ίδια αρχή και τέλος σε κάθε loop: public class Test_NestedLoops_SameLoopSize { final static int NumLoops = 4; public static void main(String[] args) { long sum = 0; for(int i=0;i<10;i++) { for(int j=0;j<10;j++) { for(int k=0;k<10;k++) { for(int w=0;w<10;w++) { sum = sum + i + j + k + w; } } } } System.out.println("No recusrive: " + sum); System.out.println(); System.out.println(" Recusrive: " + NestedLoops(4, 10)); } /* A8roisma mesa sth sunarthsh "NestedLoops". Gia na apo8hkeuetai to a8roisma meta thn ka8e klhsh ths sunarthshs. */ static long sum_r = 0; static long NestedLoops(int NumOfLoops, int SizeOfLoops) { if(NumOfLoops > 0) { for(int i=0;i<SizeOfLoops;i++) { if(NumOfLoops == 1) sum_r = sum_r + (NumLoops * i); NestedLoops(NumOfLoops-1, SizeOfLoops); } } return sum_r; } } Αυτό που δεν μπορώ να καταφέρω είναι όταν τα index δεν έχουν ίδια αρχή και τέλος σε κάθε loop!!! Καμία βοήθεια!!! Αν τα index δεν έχουν ίδια αρχή και τέλος σε κάθε loop Κάπως έτσι πρέπει να γίνει, αλλά πώς ακριβώς??? public class Test_NestedLoops_DifferentLoopSize { final static int NumLoops = 4; public static void main(String[] args) { int SizeOfLoops[] = new int[4]; SizeOfLoops[0] = 2; SizeOfLoops[1] = 3; SizeOfLoops[2] = 4; SizeOfLoops[3] = 5; long sum = 0; for(int i=0;i<SizeOfLoops[0];i++) { for(int j=0;j<SizeOfLoops[1];j++) { for(int k=0;k<SizeOfLoops[2];k++) { for(int w=0;w<SizeOfLoops[3];w++) { sum = sum + i + j + k + w; } } } } System.out.println("No recusrive: " + sum); System.out.println(); System.out.println(" Recusrive: " + NestedLoops(4, SizeOfLoops)); } /* A8roisma mesa sth sunarthsh "NestedLoops". Gia na apo8hkeuetai to a8roisma meta thn ka8e klhsh ths sunarthshs. */ static long sum_r = 0; static int j = NumLoops; static long NestedLoops(int NumOfLoops, int SizeOfLoops[]) { if(NumOfLoops > 0) { for(int i=0;i<SizeOfLoops[j];i++) { sum_r = sum_r + (NumLoops * i); NestedLoops(NumOfLoops-1, SizeOfLoops); } j--; } return sum_r; } }
Technology fan Δημοσ. 21 Αυγούστου 2013 Δημοσ. 21 Αυγούστου 2013 αφού σε είπα στην αρχή.... φτιάξε πίνακες και περασε τους ως όρισμα στη συνάρτηση.. κάπως έτσι static long NestedLoops(int NumOfLoops, int SizeOfLoops, int[] S,int[] E,int current) { if(NumOfLoops > 0) { for(int i=S[current];i<E[current];i++) { if(NumOfLoops == 1) sum_r = sum_r + (NumLoops * i); NestedLoops(NumOfLoops-1, SizeOfLoops,S,E,current+1); } } return sum_r; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα