Basic

Ackermann-Funktion

weitere Beispiele


23 kbyte
einige Programme für Power- / Quick- Basic

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