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

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

Δημοσ.

Έστω ότι κατά τη διάρκεια εκτέλεσης του προγράμματος θέλουμε να δημιουργήσουμε εμφωλευμένους βρόχους, αλλά ο αριθμός τους είναι άγνωστος.
Ψάχνοντας στο 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)
{
...
}

Δημοσ.

έστω ότι θέλεις 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);

}

 

}

Δημοσ.

Ας πούμε οτι θέλεις να τρέξεις το παρακάτω Δηλαδή 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 για να το κάνω εύκολο) κάνεις το κολπάκι που είπα στην αρχή με τους πίνακες. 

  • Like 1
Δημοσ.

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

αφού σε είπα στην αρχή.... φτιάξε πίνακες και περασε τους ως όρισμα στη συνάρτηση.. κάπως έτσι

 

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;
        
    }    

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

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

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

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

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

Σύνδεση

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

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