fakultaet

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von hazelnoot, 29.01.2007.

  1. #1 hazelnoot, 29.01.2007
    hazelnoot

    hazelnoot www.mywm.dl.am

    Dabei seit:
    13.10.2005
    Beiträge:
    377
    Zustimmungen:
    0
    Ort:
    in Geiersberg
    hi ich hab ein kleines problem ich muss die fakultaet mit einem shellscript ausrechnen(rekursiv) folgendes hab ich schon:
    Code:
    declare -i zahl=$1
    declare -i facu=0
    declare -i buf=0
    
    fac() {
        if [ ${zahl} -le 1 ]
        then
            exit 0
        fi
    
        buf=$zahl-1
    
        exit $zahl*$((`fac $buf`))
    }
    
    echo `fac $zahl`
    
    aber irgendwie werden dann extrem viel BASH prozesse gestartet :-( und gehen tuts natuerlich auch nicht...

    mfg hazelnoot
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Xanti, 29.01.2007
    Zuletzt bearbeitet: 01.02.2007
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    1. Ist die Fakultät von 0 und 1 gleich 1.

    2. Solltest Du nicht mit exit codes arbeiten, denn bei $((`fac $buf`)) wird nicht der exit code ausgewertet, sondern die normale Standardausgabe. Geeignet ist also z.B. echo.

    3. Was Deine Unmengen an Prozessen betrifft: Du arbeitest Du in jeder Rekursionsstufe mit derselben ${zahl}. Diese musst Du in jedem Schritt auf das aktualisierte $1 setzen.

    Folgendes funktioniert bei mir:

    Code:
    fac() {
        zahl=$1
        if [ ${zahl} -le 1 ]
        then
            echo 1
        else
            echo $((${zahl}*$(fac $((${zahl}-1)))))
        fi
    }
    
    echo $(fac $1)
    
    Gruß, Daniel
     
  4. #3 neutrino1, 01.02.2007
    neutrino1

    neutrino1 Mitglied

    Dabei seit:
    03.05.2005
    Beiträge:
    30
    Zustimmungen:
    0
    Hi!

    Ab zahl=9 funktioniert das bei mir nimmer ;-)
    Außerdem hab ich's nicht so mit rekursiven Funktionsaufrufen (mach ich grundsätzlich falsch und muß dann immer Fehler suchen ...), daher bastel ich mir die Rechnung als String zusammen und laß es erst am Ende ausrechnen:

    Code:
    > FAC="";Z=10;while [[ $Z -ne 0 ]];do FAC="$FAC*$Z";Z=$(($Z-1));done;echo "${FAC#*}"|bc
    3628800
     
  5. Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    Ok, der obige Code von mir war ein ungetesteter Vorschlag und hat natürlich noch Fehler. Hab ihn mal korrigiert und funktioniert auch bei mir für > 10.
     
  6. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    für jeden scheiss gibt's perl module, wieso benutzt ihr sie nicht einfach? btw: seit wann ist die shell zum rechnen da?

    #!/usr/bin/sh
    ZAHL=5
    FAC=`perl -e 'use Math::BigInt;print Math::BigInt->bfac(shift)' $ZAHL`
    echo $FAC
     
  7. #6 supersucker, 05.02.2007
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Vielleicht weil das hier

    eine FH / Uni Hausaufgabe ist......:)
     
  8. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    dann die nächste Frage: warum müssen die Unis immer noch so scheiss Aufgaben stellen?:think:
     
  9. thobit

    thobit Routinier

    Dabei seit:
    11.04.2006
    Beiträge:
    265
    Zustimmungen:
    0
    Damit man lernt wie eine Shell funktioniert und nicht unbedingt wie man eine Fakultät berechnet. Irgendwie muss man ja mal anfangen.
     
  10. yai

    yai yet another idiot

    Dabei seit:
    22.01.2007
    Beiträge:
    166
    Zustimmungen:
    0
    Jetzt sind wir aber ganz woanders, Didaktik und so. Wie eine Shell funktioniert lernt man, indem man eine Shell zu dem Zweck einsetzt, zu dem sie da ist. Und das ist eindeutig nicht Rechnen. Wie wärs denn zum Beispiel mit Start- Stopp-Skripten mit sauberem Errorhandling, sauberer Dokumentation, übersichtlichem Programmierstil etc. als Alternative zu diesem SuSE-Müll. Da kann man viel lernen!:oldman
     
  11. Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    Ok, dann aber wieso nicht "bc" ?

    man tippt z.B. in eine Textdatei "fac.txt":
    Code:
    define fac (x)
    {
        res = 1
        while (x > 1)
        {
    	res *=x;
    	x -= 1;
        }
        return res;
    }
    fac (500)
    
    und dann macht man in der Shell z.B. das:
    Code:
    cat fac.txt | bc
    
    @Didaktik: Man kann durchaus den kreativen Umgang mit Variablen lernen, wenn man mal in einer Shell was machen muß, wofür die nicht das Optimum ist... und wenn die Aufgabe nun mal war "shellscript"...
     
  12. #11 supersucker, 06.02.2007
    Zuletzt bearbeitet: 06.02.2007
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Was das mit Suse zu tun hat muss jetzt keiner verstehen oder? Oder hast du eine statistische Untersuchung gemacht und alle Suse-Scripte mit allen Nicht-Suse-Scripten in Bezug auf Errorhandling, sauberer Dokumentation, übersichtlichem Programmierstil etc. verglichen?

    Oh mann, immer dieses kindische Rumgeflame.
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 Schlaubi_fi.de, 06.02.2007
    Schlaubi_fi.de

    Schlaubi_fi.de Mac OS X User

    Dabei seit:
    22.12.2004
    Beiträge:
    304
    Zustimmungen:
    0
    Wie bemerkt Wolfgang immer so schön: "Useless use of cat" - *duck und weg* :D

    Code:
    bc <fac.txt
    
     
  15. #13 Xanti, 06.02.2007
    Zuletzt bearbeitet: 21.02.2007
    Xanti

    Xanti Mouse Organist

    Dabei seit:
    05.09.2004
    Beiträge:
    1.855
    Zustimmungen:
    0
    @yai: Es geht hier nicht um das besonders effiziente und syntaktisch sauberste Programmieren einer mathematischen Funktion. Jeder, der einmal eine Computersprache richtig gelernt hat, weiß, dass die Fakultät ein klassisches Beispiel für das Prinzip der Rekursion ist. Um die Funktionsweise einer funktionalen Sprache zu verstehen, kann man jede Sprache nutzen, auch Shellskripte oder Basic.

    Übrigens, wenn ich richtig numerisch rechnen will, halte ich Perl ebenfalls für ungeeignet. Für sowas nehme ich octave.
     
Thema:

fakultaet