Rekursionsprobleme

Michi_1989

Mitglied
Hi,

ich komm einfach nicht zu der Lösung, obwohl ich denke mal die Rekursion an sich verstehe.
Ich soll das max. Alter bestimmen. Iterativ hatte ich das für min, max und Durchschnitt folgendermaßen gelöst:
Java:
public static void Min_Max_Durchschnittsalter(int[][] stud, int AnzahlNeuerStudenten){ 
    int j=1, max=0, min=0,n=0;
    float sum=0;
   
    for (int i =0; i<50;++i){
       
        
        n = stud [i][5];     	
        sum=sum+n;
        if (j==1) 
          {
          max=n;
          min=n;
          }
          if (n>max) max=n;
          if (n<min) min=n;
          ++j;            
    }
    System.out.println("Ältester: "+ max +"\bJüngster: " +min+ "\bDurchschnittsalter: " +sum/ (25+AnzahlNeuerStudenten));
}

Wundert euch nicht wegen der Übergabe, will euch das komplette Programm ersparen. Wichtig ist nur, dass ihr seht, wie ich das iterativ gelöst habe. Nun soll ich nur das max. Alter rekusiv ermitteln.
Aber wenn ich die Methode dann rekusiv aufrufe, erfolgt dann ja wieder die Initialisierung mit 0, sodass dann der Älteste 0 ist. Iterativ musste man ja nur die Initialisierung außerhalb der Schleife machen. Wie kann man das lösen ?

Danke im Voraus
Gruß Michi
 

bLaSt

Aktives Mitglied
Hi,

ich komm einfach nicht zu der Lösung, obwohl ich denke mal die Rekursion an sich verstehe.
Ich soll das max. Alter bestimmen. Iterativ hatte ich das für min, max und Durchschnitt folgendermaßen gelöst:
Java:
public static void Min_Max_Durchschnittsalter(int[][] stud, int AnzahlNeuerStudenten){ 
    int j=1, max=0, min=0,n=0;
    float sum=0;
   
    for (int i =0; i<50;++i){
       
        
        n = stud [i][5];     	
        sum=sum+n;
        if (j==1) 
          {
          max=n;
          min=n;
          }
          if (n>max) max=n;
          if (n<min) min=n;
          ++j;            
    }
    System.out.println("Ältester: "+ max +"\bJüngster: " +min+ "\bDurchschnittsalter: " +sum/ (25+AnzahlNeuerStudenten));
}

Wundert euch nicht wegen der Übergabe, will euch das komplette Programm ersparen. Wichtig ist nur, dass ihr seht, wie ich das iterativ gelöst habe. Nun soll ich nur das max. Alter rekusiv ermitteln.
Aber wenn ich die Methode dann rekusiv aufrufe, erfolgt dann ja wieder die Initialisierung mit 0, sodass dann der Älteste 0 ist. Iterativ musste man ja nur die Initialisierung außerhalb der Schleife machen. Wie kann man das lösen ?

Danke im Voraus
Gruß Michi

Hey Michi,

also ich denke, wenn du die Deklaration deiner Variablen max und min außerhalb der Methode machst sollte das ohne Probleme gehen.Also auch die Initialisierung mit 0 ebenfalls außerhalb machen. Im übrigen am Rande ein Tipp: Variablen sollte man im Allgemeinen, außer es muss anderst sein, als private deklarieren.

Gruß blast
 

bERt0r

Top Contributor
Es macht überhaupt keinen Sinn sowas rekursiv zu lösen, das ist eine iterative Operation. Möglich isses natürlich:
Java:
int getMin(int[] array, int i)
{
   if(i<array.length-1)                 
   {
       int min=getMin(array,i+1)
       if(array[i]>min)
       {
            return min
       }
   }
return array[i];
}
 

Michi_1989

Mitglied
Hmm aber dann muss ich doch der Methode entweder irgendwelche Werte übergeben oder ich sage, dass die werte von der Initialisierung übernommen werden sollen. Aber dann wird doch nicht das max Alter errechnet, da die Methode ja immer wieder mit den übergeben Werten rekusiv aufgerufen wird. Oder habe ich da was falsch verstanden? Hier mal meine Implementierung mit Initialisierung innerhalb der Methode.

Java:
public static void aeltester(int [][] stud, int AnzahlNeuerStudenten)
{
    
   int alter = 0, max = 0, counter = 0;
   stud [25+AnzahlNeuerStudenten][5]= alter;
   
   if (alter>max) max= alter;
   ++counter;
   if (counter<=25+AnzahlNeuerStudenten) 
    aeltester(stud,AnzahlNeuerStudenten-1); 
   else 
   System.out.println("Ältester: "+max);
}
Kommt leider 0 raus. :(

Mit den modifiers weiß ich schon Bescheid, aber das sollte dann wohl in den anderen Übungen kommen.

Gruß Michi
 

Michi_1989

Mitglied
Okay mach ich .

Java:
package uebung8;

public class Uebung8 {

        
public enum Studiengang {WINF, INF, MINF, MT, GET};

 //Prüfungen zufällig bestanden/nicht bestanden.

public static void pruefungen(){
    
    int Menge = 0, AnzahlPruef;
    
    System.out.print("hat Prüfung: ");
         for (int k = 0; k < 32; ++k)      
            {
            Menge = Menge << 1;
            Menge = Menge + (int)(Math.round(Math.random()));
            }
            AnzahlPruef = 0;
            for (int l = 0; l < 32; ++l)
		{
                if (Menge % 2 == 1)
                {
                
                System.out.print((32-l)+" ");
                ++AnzahlPruef;
                }
                Menge = Menge >>> 1;
		}
                System.out.print("bestanden \nund somit "+AnzahlPruef+" von 32 Prüfungen geschafft.\n");
       
}

// Vor- Nachnamen erstellen und den Studenten zufällig zuordnen.
public static void Namen (){
    
    char [][] Vornamen = {{'S','u','s','a','n'},{'R','o','l','a','n','d'},{'E','d','d','i','e'},{'S','u','s','a','n','n','a','h'},
                         {'M','a','r','i','u','s'},{'R','o','s','a','l','i','n','d'},{'M','i','c','h','a','e','l'},{'C','u','t','h','b','e','r','t'},
                         {'L','i','s','a'},{'E','z','i','o'}};

    char [][] Nachnamen = {{'D','e','l','g','a','d','o'},{'D','e','s','c','h','a','i','n'},{'D','e','a','n'},{'H','o','l','m','e','s'},
                          {'A','u','d','i','t','o','r','e'},{'M','o','r','t'},{'I','p','m','a','n'},{'S','i','n','c','l','a','i','r'},
                          {'F','l','a','k'},{'C','a','r','t','m','a','n'}};
    
    {
    int n = (int) (100*Math.random()%10);
    int m = (int) (100*Math.random()%10);
    System.out.print(Vornamen[n]);
    System.out.print(" ");
    System.out.println(Nachnamen[m]);
    }
   
}
public static void Min_Durchschnittsalter(int[][] stud, int AnzahlNeuerStudenten){ 
    int j=1, min=0,n=0;
    float sum=0;
    
    for (int i =0; i<25+AnzahlNeuerStudenten;++i){
       
        
        n = stud [i][5];     	
        sum=sum+n;
        if (j==1) 
          {
          min=n;
          }
          if(n<min) min=n;
          ++j;            
    }
    System.out.println("Jüngster: " +min+ "\bDurchschnittsalter: " +sum/ (25+AnzahlNeuerStudenten));
}

public static void Studenteninit (int [][] stud){
    Studiengang a = Studiengang.WINF;  
    
  
    for ( int i=0 ; i<stud.length;++i){ 
                                                                                
        stud[i][0] = (int) (10000+9583*Math.random()); //5-stellige  Zahlen
        stud[i][1] = (int) (1980+10*Math.random()); // geb. ab 1980
        stud[i][2] = (int) (1+100*Math.random()%12); //Werte 1...12
        stud[i][3] = (int) (1+100*Math.random()%30); // Werte 1..30


        stud[i][5] = (int) ((2011*365+11*30+07)-(stud[i][1]*365+stud[i][2]*30+stud[i][3]))/365; // Alter mit Array berechen

        // Studiengang zufällig zuordnen.
        int t =(int) (Math.random()*5);
    
        switch(t){
            case 0 : a = Studiengang.WINF; stud[i][4] = 2;                     
            break;
            case 1 : a = Studiengang.INF; stud[i][4] = 2;                
            break;
            case 2 : a = Studiengang.MINF; stud[i][4] = 2;
            break;
            case 3 : a = Studiengang.MT; stud[i][4] = 1;
            break;
            case 4 : a = Studiengang.GET; stud[i][4] = 1;
        }
    }  
   System.out.println("\nStudiengang: "+ a);
}

public static void NeuerStudent(int [][] stud,int AnzahlNeuerStudenten){
    
    for (int i=0; i<1; ++i ){
        
        Studenteninit(stud);
        System.out.println("Matr: " + stud[i][0]);
        System.out.println("Geb: " + stud[i][3] + "."+ stud[i][2]+"."+stud[i][1]);
        System.out.println("FB: "+stud[i][4]);
        System.out.println("Alter: "+stud[i][5]);
        Namen();
        
    }
}

public static void printStudenten (int [][] stud,int AnzahlNeuerStudenten){
   int counter = 0;
 
  for (int i = 0; i<25+AnzahlNeuerStudenten;++i){
  if (counter<25)
        {
        Studenteninit (stud);
        System.out.println("Matr: " + stud[i][0]);
        System.out.println("Geb: " + stud[i][3] + "."+ stud[i][2]+"."+stud[i][1]);
        System.out.println("FB: "+stud[i][4]);
        System.out.println("Alter: "+stud[i][5]);
        Namen();
        pruefungen();
        
        ++counter;        
        } 
        else
        if (counter<stud.length)
            {
            NeuerStudent(stud,AnzahlNeuerStudenten);
            ++counter;
            }
            else
            {
            System.out.println("\nFehler: Es wurden zu viele Studenten im Array angelegt!");
            break;
            }
            }
             
}

public static void aeltester(int [][] stud, int AnzahlNeuerStudenten)
{
    
   int alter = 0, max = 0, counter = 0;
   stud [25+AnzahlNeuerStudenten][5]= alter;
   
   if (alter>max) max= alter;
   ++counter;
   if (counter<=25+AnzahlNeuerStudenten) 
    aeltester(stud,AnzahlNeuerStudenten-1); 
   else 
   System.out.println("Ältester: "+max);
}
   
//public static int [][] AusgabeStud(Studiengang Auswahl)
//{
//switch(Auswahl)
//{
//    case WINF : return  
//}
//}

public static void main(String[] args) {
   
    int [][] stud = new int  [50][6];
    int AnzahlNeuerStudenten = 5;
   
    printStudenten(stud,AnzahlNeuerStudenten); 
    Min_Durchschnittsalter(stud,AnzahlNeuerStudenten);
 //   aeltester(stud,AnzahlNeuerStudenten);       
}     
      
}
 

Michi_1989

Mitglied
Achso mit der Startklasse habe ich jetzt erst gesehen. Also die Umstellung auf OOP erfolgt in der nächsten Übung.
Weiß denn echt keiner wie ich das max. Alter rekusiv errechnen kann ?

Gruß Michi
 

Neue Themen


Oben