fakultaet

hazelnoot

hazelnoot

www.mywm.dl.am
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
 
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
 
Zuletzt bearbeitet:
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
 
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.
 
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
 
dann die nächste Frage: warum müssen die Unis immer noch so scheiss Aufgaben stellen?:think:
 
Damit man lernt wie eine Shell funktioniert und nicht unbedingt wie man eine Fakultät berechnet. Irgendwie muss man ja mal anfangen.
 
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
 
für jeden scheiss gibt's perl module, wieso benutzt ihr sie nicht einfach? btw: seit wann ist die shell zum rechnen da?
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"...
 
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.

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.
 
Zuletzt bearbeitet:
@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.
 
Zuletzt bearbeitet:

Ähnliche Themen

Switche abfragen über Script

NAS-Drive Mount in Bash-Script über crontab

script sshpass

Verschlüsseltes Backup-Script mit rsync

Rückgabe eines Befehls

Zurück
Oben