steffen: rekursionsproblem

Hi leute,

wir sollten heute in der schule die fakultät berechnen. easy dachte ich mir und bastelte das hier:

public class fakultaet{

public static int fak(int muh){
   int hans=1;

if(!(muh==0)){
    hans=muh*fak(muh-1);
     }
     return hans;
 }

public static void main(String[] args){

int zahl=3;
  System.out.println("Die Fakultaet von" + zahl + " = " + fak(zahl));
 }
}

jedoch verlangt er bei der variable hans ein wert. diesen wert multipliziert er mit dem ergebnis. d.h. wenn ich hans=10; schreiben würde wäre das ergebnis anstatt 6 10 ?!

aber wieso multipliziert er das ergebnis mit der variable hans? ich weiß nicht mehr weiter :(

mfg steffen

  1. Hi Steffen,

    ich bin zwar nicht der Könner und verstehe auch nicht Deinen Quellcode (Sprache???).
    Aber wieso möchtest Du bei der Fakultät etwas mit Rekursion machen?

    Geht das nicht besser so:

    x = EINGABE;
    ergebnis = 0;

    solange x > 0 {
      Ergebnis = Ergebnis * x;
      x--;
    }

    ErgebnistextBastelnUndAusgeben(Ergebnis);

    Gruß von Tom

    1. Hi Tom,

      Hi Steffen,

      ich bin zwar nicht der Könner und verstehe auch nicht Deinen Quellcode (Sprache???).
      Aber wieso möchtest Du bei der Fakultät etwas mit Rekursion machen?

      ist einfach eine übung für mich selbst ;)

      Trotzdem versteh ich es ja nicht :)

      1. Hi Steffen,

        hab Dein Script mal ausprobiert und bei mir funktioniert es.
        Das einzige, was ich geändert habe ist: Klassenname gross geschrieben.

        Trotzdem würde ich Dein Problem mit 'ner Schleife lösen.

        Etwa so:

        public static int fakultaetBerechnen(int fakZahl){
           int ergebnis = 1;
           int i = 1;

        while(i <= fakZahl){
             ergebnis = ergebnis * i;
             i++;
           }
           return ergebnis;
         }

        1. hi tefchen,

          es war absicht das ich hier die rekursion benutze.

          und ja der code geht den ich auch gepostet habe, nur setz mal bei hans = 10; ein dann gehts nich mehr weil er das ergebnis * 10 nimmt

          steffen

  2. Hi leute,

    Servus!

    1. Spare dir hans

    2. Baue die Rekursion korrekt auf:
      Erst die Abbruchbedinung (hier mit return 1; als neutrales Element der Multiplikation)
      Dann was sonst passiert.

    Dein Problem liegt in den Activation Records, die Java intern für die Rekursion benutzt. Wenn du nämlich an der Abbruchbedinung angelangt bist arbeitet sich Java von hinten nach vorn durch die Ergebnisse durch, bis eben zu hans. Rekursionen sind eigentlich ziemlich simpel, wenn du aber nicht konsequent arbeitest kommst du in Teufels Küche.

    Hier mein Vorschlag:

    public class fakultaet {

    public static int fak(int muh){
      if(muh==0) return 1;
      else return muh*fak(muh-1);
     }

    public static void main(String[] args){
      int zahl=4;
      System.out.println("Die Fakultaet von " + zahl + " = " + fak(zahl));
     }
    }

    Tschö,
    dbenzhuser

  3. Hi,

    Für den Fall muh == 0, also fak(0), wird folgender Code ausgeführt:

    int hans=1;
         return hans;

    Für muh == 1 wird effektiv folgender Code ausgeführt:

    hans=muh*fak(0);
         return hans;

    was aber gleichbedeutend ist mit

    hans=muh*hans;
           return hans;

    weil ja für muh == 0, also fak(0), der Wert von hans zurückgegeben wird.
    Also wird das Ergebnis mit dem (falschen) Wert von fak(0) multipliziert.
    0! ist als 1 festgelegt, nicht als 10 - also ist es sinnlos, dort den Wert 10 einzusetzen...

    Ach ja, Deine Funktion hat ein Problem:

    ruf mal fak(-1) auf ;-)

    cu,
    Andreas

    --
    MudGuard? Siehe http://www.mud-guard.de/