Unterabschnitte


A.2.2 Fakultät

A.2.2.1 Javaversion

Der Quelltext für die Javaversion ist folgender:

// Time-stamp: "29.03.06 15:46 fakultaet.java klaus@wachtler.de"
//
// Musterlösung der Aufgabe "Fakultät".
// Es wird die Fakultät einer Zahl jeweils iterativ und rekursiv
// berechnet und die dafür benötigten Laufzeiten ausgegeben.
//
// javac fakultaet.java && java fakultaet

import java.util.*;

public class fakultaet
{
    // Berechnet iterativ die Fakultät des übergebenen Parameters
    public static long fakultaet_iterativ( int n )
    {
        long produkt = 1;
        for( int i=2; i<=n; ++i )
        {
            produkt *= i;
        }
        return produkt;
    }

    // Berechnet rekursiv die Fakultät des übergebenen Parameters
    public static long fakultaet_rekursiv( int n )
    {
        return n<=1 ? 1 : n*fakultaet_rekursiv( n-1 );
    }

    public static void main( String args[] )
    {
        final int  anzahl = 1000000; // Soviele Durchläufem um die
                                     // Auflösung der internen Uhr zu
                                     // erhöhen
        long    start, ende;         // der Zeitmessung

        start = System.currentTimeMillis();
        for( int i=0; i<anzahl; ++i )
        {
            fakultaet_rekursiv( 15 );
        }
        ende = System.currentTimeMillis();
        System.out.println( "rekursiv:   "
                            +
                            ( (double)ende  -start )/anzahl
                            +
                            " msec"
                            );

        start = System.currentTimeMillis();
        for( int i=0; i<anzahl; ++i )
        {
            fakultaet_iterativ( 15 );
        }
        ende = System.currentTimeMillis();
        System.out.println( "iterativ:   "
                            +
                            ( (double)ende  -start )/anzahl
                            +
                            " msec"
                            );


        //System.out.println( "" + n + "! = " + fakultaet_rekursiv( n ) );
        //System.out.println( "" + n + "! = " + fakultaet_iterativ( n ) );
    }

} // public class fakultaet

Das Programm erzeugt auf meinem Rechner folgende Ausgabe:

rekursiv:   0.009647 msec
iterativ:   0.001996 msec

A.2.2.2 C-Version

Der Quelltext für die C-Version ist folgender:

/* Time-stamp: "29.03.06 15:58 fakultaet.c klaus@wachtler.de"
 *
 *
 * Musterlösung der Aufgabe "Fakultät"
 *
 */

#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <time.h>


// Berechnet iterativ die Fakultät des übergebenen Parameters
long fakultaet_iterativ( int n )
{
  long produkt = 1;
  int  i;
  for( i=2; i<=n; ++i )
  {
    produkt *= i;
  }
  return produkt;
}

// Berechnet rekursiv die Fakultät des übergebenen Parameters
long fakultaet_rekursiv( int n )
{
  return n<=1 ? 1 : n*fakultaet_rekursiv( n-1 );
}

int main( int nargs, char **args )
{
  const int  anzahl = 10000000; // Soviele Durchläufem um die
                                // Auflösung der internen Uhr zu
                                // erhöhen
  clock_t start, ende;          // der Zeitmessung
  int     i;

  start = clock();
  for( i=0; i<anzahl; ++i )
  {
    fakultaet_rekursiv( 15 );
  }
  ende = clock();
  printf( "rekursiv:  %f msec\n",
          ( (double)ende  -start )/CLOCKS_PER_SEC/anzahl*1000
          );

  start = clock();
  for( i=0; i<anzahl; ++i )
  {
    fakultaet_iterativ( 15 );
  }
  ende = clock();
  printf( "rekursiv:  %f msec\n",
          ( (double)ende  -start )/CLOCKS_PER_SEC/anzahl*1000
          );

  return 0;
} /* main( int nargs, char **args ) */

Das Programm erzeugt auf meinem Rechner folgende Ausgabe:

rekursiv:  0.000408 msec
rekursiv:  0.000269 msec



www.wachtler.de