# Iterativ/rekursiv



## Oldepieder (18. Feb 2010)

Hallo vorab,
Also habe diese Aufgabe bekommen. Wir sollen diese Vorhanden Programme von Iterativ in Rekursiv umwandeln. Leider war ich länger krank in der Schule und kannte dem Unterrichtsstoff nicht folgen. Habe mich dann dran gesetzt und versucht es zu lösen habe auch Teile davon geschafft leider stehe ich bei den Aufgaben mit dem Man vor dem Fehrnsehr und max iterativ/rekusiv auf dem Schlauch. Würde mich über Lösungen freuen 


```
import java.io.*;

import java.lang.String.*;

class RekursionAufgabenInfosUndHilfen2010

  // Anfang Attribute
  // Ende Attribute

{ /* Zum Testen von Methoden benötigt man eigentlich keine Objekte.
    daher setzt man das Wörtchen "static" vor die Methoden und Funktionen und
    Variablen, was meint, das eben keine Objekt dieser Klasse erzeugt werden muss,
    um sie zu benutzen. Solche Klasse static-Methoden ist z.B. die Klasse
    Math, deren Funktionen wie sin, cos, und Konstanten wie PI ich ohne ein
    new Math() benutzen kann.
  */
 /* Die startFernsehn-Methode soll die an der Tafel skizzierte Darstellung liefern z.B.
    Dabei ist die Einrückung nur eine Zusatzaufgabe.
    Man filmte einen Mann,
      der einen Mann sah,(1)
       der einen Mann sah,(2)
        der einen Mann sah,(3)
        der fern sah(3)
       er fern sah(2)
      er fern sah(1)
    der fern sah

    Die Methoden pot (Potenz) , reverse, sind Lösungen aus der Stufe 11 und
    funktionieren als
        iterative Lösungen
        d.h. die Wiederholung ist mit einer Schleife realisiert
    Lösche den alten Funktionenrumpf und realisiere eine rekursive Lösung!

    Mit einer rekursiven Funktion  int max (int [] reihe, int suchGrenze)
    soll das größte Element einer Reihung bestimmt werden. Die iterative Lösung findest du unten!
    Dabei sollte man vielleicht die Hilfsfunktion zur Bestimmung des Maxiumums zweier
    Zahlen benutzen. (s.u.)
    !!!Vor dem Starten mit dem Javaeditor muss man bei
    ---> Fenster --> Konfiguration --> Optionen
              Programme ohne Konsolenfenster starten            deaktivieren,
    weil man sonst keine Tastatureingaben vornehmen kann. !!!


*/

  // Anfang Methoden
  /*
  static double pot(double basis, int exponent)
  {
    int zähler = 1;
    double ergebnis = 1;

    while(zähler <= exponent)
    {
      ergebnis *= basis;
      zähler++;
    }

    return ergebnis;
  }
  */

    static double pot(double basis, int exponent)
  {
    if(exponent>0)
    {
      return basis*pot(basis,exponent-1);
    }
    else
    {
      return 1;
    }
  }
  
  /*
  static String reverse(String s)
  {
    String tmp = "";

    for ( int i = s.length() - 1; i >= 0; i-- )
    {
      tmp += s.charAt(i);
    }
    return tmp;
  }
  */

  static String reverse(String s)
  {
    String buchstabe = "";
    if(s.length()>1)
    {
      buchstabe += s.charAt(0);
      s = s.substring(1);
      return reverse(s)+buchstabe;
    }
    else
    {
      return s;
    }
  }
  static boolean palindrom(String s)
  {
    return s.equals(reverse(s));
  }
 //Beispiel für eine Funktion mit einem Array-Parameter  static int lastElement(int[] reihe)  {
   //return reihe[reihe.length-1];

 // Iterative Lösung des Maximums einer Reihe
 static int max(int a, int b)   //Hilfsfunktion! Bitte auch benutzen!!
 {
  if (a<b) return b;
  return a;
 }

static int maxRekursiv (int [] reihe, int suchGrenze)  //Rekursive Lösung {  return 0; } //Das Beispiel aus dem Einstieg angefangen static void startFernsehn(int insgesamt)
{
  return 0;
}
static void fernsehn(int zaehler, int insgesamt) {
        //Aufgabe
    //int zaehler=1;
  System.out.println("Man filmte einen Mann, " );
  //fernsehn(zaehler,insgesamt);
  System.out.println("der fern sah" );

}

public static void main(String args[]) throws IOException // Hauptprogramm
  { System.out.println("Die Ausgabe der ersten 10 Potenzen von 4 ergibt: ");
     for (int i=0; i<=10; i++)
          { System.out.print(" "+pot(4, i));
          }
     System.out.println("");
    /* zum Testen von reverse und Palindrom über Tastatureingeabe
       deswegen steht nämlich auch trows IOException bei der main-Methode
    */
    /**********************************************************/
    InputStreamReader tastaturLeser = new InputStreamReader(System.in);
    BufferedReader eingabe = new BufferedReader(tastaturLeser);
    System.out.println("Gib einen Text zum Umdrehen ein: ");
    String s=eingabe.readLine(), umgedreht=reverse(s);
    eingabe.close();
    System.out.println("Umgedreht: "+umgedreht);
    if(s.equals(umgedreht))
      System.out.println(s+" ist Palindrom");
    else  System.out.println(s+" ist kein Palindrom");
    /***********Beispiel zum Test der lastElement-Funktion*****/
     int [] reihe= { 3, 2, 17, 15, 8, 18 };

     System.out.println("Reihe: ");
     for (int i=0; i<reihe.length; i++)
          { System.out.print(" "+reihe[i]);
          }
     System.out.println("");
     //System.out.println("last: "+ lastElement(reihe));
     System.out.println("Max: "+ maxIterativ(reihe));

   /***********************************************************/
   //startFernsehn(3) ;

  } // Ende von main
  // Ende Methoden
} // Ende von class RekursionAufgabenInfosUndHilfen2010
```


----------



## ireas (18. Feb 2010)

Hi!

Es steht ja schon da: _Wir machen keine Hausaufgaben, aber wir helfen dabei._ Deswegen von mir keine Lösung, sonder nur ein paar Tipps.

*Rekursion* Also erstmal voraus: Rekursion ist ganz wichtig beim Programmieren! Du solltest das auf jedenl Fall nochmal nachholen! Rekursion bedeutet eigentlich, daß man eine Funktion hat, die sich selbst immer wieder aufruft. Dabei vereinfacht man das Problem immer weiter, bis man am Ende etwas ganz Einfaches übrig hat. Beispiel: Fakultäten. 5! = 5 * 4! = 5 * 4 * 3! = 5 * 4 * 3 * 2! = 5 * 4 * 3 * 2 * 1! = 5 * 4 * 3 * 2 * 1.  5! ist vielleicht auf die Schnelle schwer auszurechnen. Durch die Rekursion kannst Du das aber auf 1! = 1 zurückführen und dann durch einfaches Multiplizieren wieder zusammenbauen. In Java sähe das so aus:

```
/**
 * Berechnet die Fakultät von i.
 * @param i Zahl, deren Fakultät berechnet werden soll
 * @return Fakultät von i
 */
public int fak(int i) {
    // 1! = 1
    if (i == 1) {
        return 1;
    } else {
        return i*fak(i-1);
    }
}
```
Versuch mal, das nachzuvollziehen. Dann kannst Du mal überlegen, wie Du das auf Deinen Mann anweden könntest. Dann kanst Du weiterlesen 

Wenn Du inzwischen drauf gekommen bist – gut. Wenn nicht, schau Dir mal folgende Funktion an:


```
public void foo(int i) {
    System.out.println("A");
    foo(i-1);
    System.out.println("B");
}
```

Daraus läßt sich realtiv leicht die gewünschte Funktion basteln.

Viel Erfolg!


----------



## Landei (18. Feb 2010)

Da ist ein Bug drin...


```
public int fak(int i) {
    // 1! = 1
    if (i == 1) {
        return 1;
    } else {
        return i*fak(i-1);  //irgendwo muss man schon multiplizieren :-)
    }
}
```


----------



## ireas (18. Feb 2010)

oups, danke für den Hinweis! Hab‘s geändert.


----------



## Oldepieder (19. Feb 2010)

Danke schon habt mir sehr geholfen


----------

