Basic
Ackermann-Funktion
Beschreibung
Das klassischste Beispiel für rekursive Funktionsaufrufe in der Informatik ist die Ackermannfunktion. (ein kleines Leckerli für die Info-Studenten unter ihnen?) Dieses Programm verwendet die alt bekannte vernestete Version ... falls sie lange Weile haben, eine typische Übungsaufgabe der Informatik wäre das Suchen der zugehörigen Iteration.
Quelltext
'Ackermannfunktion
$STACK 32766
PRINT "Ackerman laeuft"
X# = TIMER 'diese Variable nimmt die
Zeit vor ...
Ans% = FNAck%(3,6) 'rekursiver Funktionsaufruf
XX# = TIMER '... und diese Variable
die Zeit nach dem rekursiven Aufruf auf ...
HowLong# = XX# - X# '... um den zeitlichen
Aufwand der Funktion zu verdeutlichen.
PRINT USING "Ackerman lief durch in ##.###
Sekunden"; HowLong#
END
DEF FNAck%(M%,N%) ' FKT: Ackerman
IF M% = 0 THEN
FNAck% = N%+1
ELSEIF N% = 0 THEN
FNAck% = FNAck%(M%-1,1)
ELSE
FNAck% = FNAck%(M%-1,(FNAck%(M%,N%-1)))
' durch diesen Aufruf entsteht
die vernestete Rekursion
END IF
END DEF
Musik
Beschreibung
Ein kleines Beispiel, um den Befehl "PLAY" etwas näher zu bringen. Das Programm fragt Noten über die Tastatur ab, kennt mehrere Oktaven und gibt die gespielten Noten formatiert am Bildschirm aus ...
Quelltext:
'Nettes Prograemmle um ein bisschen mit Sound zu spielen.
'Eingabe ueber Tasten 1-0, > bzw < zum Wechseln der
'Oktave - Q zum Abbrechen.
CLS 'Clear Screen -
"loescht" den Bildschirminhalt
x=1
y=1
DO
DO
LOCATE (x),(y)
'setzt den Cursor auf die Position x,y
hit$=INKEY$ 'holt ein Zeichen aus dem Tastaturpuffer
SELECT CASE hit$
'Eventhandler
CASE
"1"
PLAY"c"
hit$="c"
CASE "2"
PLAY"d"
hit$="d"
CASE "3"
PLAY"e"
hit$="e"
CASE
"4"
PLAY"f"
hit$="f"
CASE "5"
PLAY"g"
hit$="g"
CASE "6"
PLAY"a"
hit$="a"
CASE "7"
PLAY"b"
hit$="h"
CASE
"<"
PLAY "<"
CASE ">"
PLAY ">"
CASE " "
'setzt Position des Cursor zurück, um vorige Note überschreiben zu können
IF y>4 THEN
DECR y, 4
ELSE
DECR x
y=54
END IF
EXIT LOOP
CASE "q"
END
CASE ELSE
EXIT LOOP
END SELECT
INCR y, 4 'die Position des Cursors
wird verschoben
IF y>55 THEN
y=1
INCR x
END IF
PRINT hit$ 'die gespielte Note wird ausgegeben
LOOP
LOOP
(ac/tom) Diskussion