Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP: Fakultät

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] PHP: Fakultät

    Hallo,
    ich habe folgendes Problem:
    Mein Versuch ist es über ein Formular und der späteren Verarbeitung mit PHP den Algorithmus "Fakultät" zu erstellen.
    Falls jemand nicht mehr weiß, was es genau ist:
    http://de.wikipedia.org/wiki/Fakult%...8Mathematik%29

    Mein momentaner Stand sieht wie folgt aus:
    Das Formular habe ich per HTML fertiggestellt.
    Nun haben sich ein paar Probleme in der PHP Datei ergeben.
    So sieht diese bisher aus:
    PHP-Code:
    <?php
    require_once("tpl.class.php");
    $dateiname "dateiname";
    $tpl = new template();

     if(isset(
    $_POST["zahl"]))
     {
     
    $zahl $_POST["zahl"];
     
      if (
    $zahl <=1)
      {
      
    $ausgabe "1";
      }
      else
      {
      
    $ausgabe ="Test";
      }
      }
      
        
    $arparm = array(
      
    "zahl"=>$zahl,
      
    "ausgabe"=>$ausgabe
        
    );

        print 
    $tpl->display($dateiname$arparm);

    ?>
    In der Zeile " $ausgabe ="Test"; " muss ich nun per while-Schleife die Fakultät für die Zahlen >2 darstellen. Doch im Moment fällt mir der Ansatz und ich bitte euch um Hilfe. Es wäre nett, wenn ich mich unterstützen könntet, wie man mein Problem löst.

    Ein rießen Dankeschön schonmal im Vorraus.

    Mit freundlichen Grüßen
    Tobi

  • #2
    Hmm? Was willst du jetzt? So etwas?
    PHP-Code:
    $result 1;
    for (
    $i = (int)$_POST["zahl"]; $i >= 2; --$i) {
        
    $result *= $i;
    }

    var_dump($result); 

    Kommentar


    • #3
      PHP-Code:
      $f 5// Fakultaet
      $r 1;
      while ((
      $r *= $f--) && $f 1){}
      echo 
      $r

      Kommentar


      • #4
        Das stimmt aber nicht ganz, denn 0! ist auch 1. Während der von mir gepostete Algorithmus das beachtet, tut deiner das nicht. Da müsste noch eine weitere Prüfung rein bzw. du müsstest die Operanden umdrehen.

        PHP-Code:
        $n 5// Fakultaet
        $f 1;
        while (
        $n && ($f *= $n--)){}
        echo 
        $f

        Kommentar


        • #5
          Nun, dann drehen wir doch einfach die && Abfrage um:

          PHP-Code:
          $f 5// Fakultaet
          $r 1;
          while (
          $f && ($r *= $f--)){}
          echo 
          $r

          Kommentar


          • #6
            Schneller.

            Kommentar


            • #7
              Also meint ihr, so müsste es klappen?

              PHP-Code:
              <?php
              require_once("tpl.class.php");
              $dateiname "dateiname";
              $tpl = new template();

               if(isset(
              $_POST["zahl"]))
               {
               
              $zahl $_POST["zahl"];
               
                if (
              $zahl <=1)
                {
                
              $ausgabe "1";
                }
                else
                {
                
              $n 5// Fakultaet
                
              $f 1;
                while (
              $n && ($f *= $n--)){}
                echo 
              $f;  
                }
                }
                
                  
              $arparm = array(
                
              "zahl"=>$zahl,
                
              "ausgabe"=>$ausgabe
                  
              );

                  print 
              $tpl->display($dateiname$arparm);

              ?>

              Kommentar


              • #8
                Die Abfrage, ob $zahl <= 1 ist, kannst du dir sparen und wenn du Young Jedis Vorschlag nimmst, musst du die Variablen auch noch anpassen. Das sind aber absolute Grundlagen, die wir dir hier nicht beibringen werden. Wenn du noch Probleme mit dem grundsätzlichen Verständnis von PHP hast, dann solltest du dir zu allererst einmal ein entsprechendes Buch kaufen.
                Und warum probierst du nicht einfach aus, ob es funktioniert?

                Kommentar


                • #9
                  Habe schonmal einen Lösungsvorschlag für die Fakultät mit rekursivem Funktionsabruf gesehen und hier http://www.webmasterpro.de/coding/ar...ammierung.html folgendes gefunden:
                  PHP-Code:
                  <?php  function fak(n) {    if(0)      return fak(n-1);    else      return 1;  }?>

                  Kommentar


                  • #10
                    Die Rekursion ist genial.

                    Kommentar


                    • #11
                      Zitat von Wolla Beitrag anzeigen
                      Die Rekursion ist genial.
                      Und sollte jedem, der sich auch nur ein einziges mal mit Fakultät auseinander gesetzt hat, bekannt sein. Denn genau das ist die Umsetzung der (rekursiven) mathematischen Definition! Man muss im Prinzip nur noch abschreiben.


                      (Quelle: wikipedia.org, Stand: 11.03.2011)

                      Kommentar


                      • #12
                        nur geht sie von der Sache her 1 Rechenschritt zu weit, da neben

                        0! = 1 auch 1!=1 gilt...

                        PHP-Code:
                        <?php  function fak(n) {    if(1)      return fak(n-1);    else      return 1;  }?>

                        Kommentar


                        • #13
                          0! = 1 auch 1!=1 gilt...
                          Das gibt dir die von drsoong gezeigte Funktion aber auch zurück.

                          Code:
                          return n * fak(n-1);
                          =>
                          Code:
                          1 * fak(0)
                          =>
                          Code:
                          1 * 1

                          Kommentar


                          • #14
                            sie rennt aber 1 Rechenschritt weiter als meine - ist eventuell aus Gesichtspunkten des Stack wichtig, wenn die Fakultät größerer Zahlen gewünscht wird, weil ja bei jedem Rekursionsaufruf die Rücksprung-Adresse und der übergabe-Parameter aufm Stack landen....

                            Kommentar


                            • #15
                              Zitat von eagle275 Beitrag anzeigen
                              sie rennt aber 1 Rechenschritt weiter als meine - ist eventuell aus Gesichtspunkten des Stack wichtig, wenn die Fakultät größerer Zahlen gewünscht wird, weil ja bei jedem Rekursionsaufruf die Rücksprung-Adresse und der übergabe-Parameter aufm Stack landen....
                              Ja, aber dann ist deine Änderung am Vorgehen auch nur noch der Tropfen auf den heißen Stein, weil dein Script (wenn wirklich die Größe des Stacks einen Abbruch bewirken sollte) dann auch noch die Fakultät von x+1 berechnen kann, während die andere Version „nur“ bis x kommt.

                              Als „Lernbeispiel“ für Rekursion ist die Implementierung einer Fakultät-Funktion zwar eine feine Sache - in der Praxis aber eigentlich eher Murks, weil die Rekursion hier praktisch keinerlei Vorteil bringt.

                              Meine Version wäre deshalb eher diese:
                              PHP-Code:
                              function fakultaet($n) { 
                                for(
                              $f=1$i=2$i<=$n; ++$i$f *= $i
                                return 
                              $f

                              Allerdings ist bei der Fakultät in der Praxis auf „unseren“ Rechnern der Stack sowieso nicht das Problem - beide Versionen kommen bei mir bis 170! (7.257415615308E+306), danach zeigen sie nur noch INF an, weil ich den Float-Wertebereich auf meinem (32-Bit) System überschreite*.

                              Wenn das ganze jetzt aber auf einem „Supercomputer“ laufen würde, der vielleicht die Fakultät von sechs-, sieben-, achtstelligen oder noch größeren Zahlen berechnen kann - dann dürfte sich der Stack-Overhead gegenüber der iterativen Lösung doch schon deutlich bemerkbar machen.


                              * Mit BC Math käme man zwar vermutlich noch weiter, aber dann möchte ich wirklich nicht mehr über die Performance nachdenken, wenn Strings statt Zahlen für die Rechnung verwendet werden.

                              Kommentar

                              Lädt...
                              X