BuK/IIm20/Vorlesung 9 Grüning

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Python</language>
= Kreativaufgabe Registermaschine für die natürliche Quadratwurzel Seite 32 =

Vorüberlegungen in Python

<code id="60a9009e3ab82">
def get_sqrt_int(n):
	nat = 0
	ret = 0
	while True:
		if nat **2 <= n:
			ret = nat
		else:
			return ret
		nat += 1
</code>
<run id="60a92361592ba">
print(get_sqrt_int(5))
</run>


Code für eine Register Maschine für $w(n) = \lfloor\sqrt n\rfloor$

Dabei ist der Parameter n im Register R_param abzulegen. Die Benennung der Register erfolgte um die Überlegungen zum Code zu beschleunigen.
Man könnte die Register wieder konventionell zurückbenennen zu R mit Indizierung.
Zu dem wurden Labelnamen vergeben, um die GOTOs bei der Erstellung des Codes nicht immer wieder anzupassen, da neue Zeilen hinzugefügt/entfernt werden können. Man könnte die Labels ebenfalls entfernen und mit den Zeilen Zahlen ersetzen.

<code id="60b0ebe4af5c7">
R_param = 5 # n
R_param_1 = 0
R_param_2 = 0
R_nat = 0 # nat
R_ret = 0 # ret
R_one = 1 # +/-= 1
while:
    R_param_1 = R_nat
    GOTO quad
    if_sqrt:
        R_param_2 = R_param
        GOTO Ist_A_kleiner_gleich_B_start
        A_kleiner_gleich_b_end:
            #R_quad_param <= n
            IFZERO R_param_1 GOTO else
                R_ret = R_nat
                GOTO plus
            else:
                R_param = R_ret
                STOP
            plus:
                R_nat += R_one
            GOTO while

quad: #R_param_1
R_second_quad_factor = R_param_1
R_quad_helper = 0
if_quad:
    IFZERO R_second_quad_factor GOTO ende_quad
    R_quad_helper += R_param_1 (Vorbelegungen der Register mit Null)
    R_second_quad_factor -= R_one
    GOTO if_quad
ende_quad:
    R_param_1 = R_quad_helper
    GOTO if_sqrt


Ist_A_kleiner_gleich_B_start:
IFZERO R_param_2 GOTO B_zero
IFZERO R_param_1 GOTO A_kleiner_B
    R_param_1 -= R_one
    R_param_2 -= R_one
    GOTO Ist_A_kleiner_gleich_B_start
B_zero:
IFZERO R_param_1 GOTO A_gleich_B
A_größer_B:
R_param_1 = 0
GOTO A_kleiner_gleich_b_end
A_gleich_B:
R_param_1 = 1
GOTO A_kleiner_gleich_b_end
A_kleiner_B:
R_param_1 = 1
GOTO A_kleiner_gleich_b_end

</code>

Schreibtischtest wobei das Register immer nur bei Neubelegung aufgeschrieben wurde. R_param ist mit dem Startwert 5 belegt und liefert die 2 im gleichen Register nach dem Stop.

[[Bild:Schreibtischtest.png]]