Ich steh vor folgendem Problem:
Ich soll einen Algorithmus schreiben der zwei beliebige positive natürliche Zahlen addiert und das Ergebnis ausgibt. Das Problem dabei ist, dass ich zur Berechnung nur folgende Operationen zur berechnung benutzen darf:
n = a Zuweisung: n erhält den Wert von a
n = n + 1
n = n - 1
a == b
a != b
if
while
Ich kriegs damit nicht hin. Jemand von euch ne Ahnung?
n1 = a // erster Summand
n2 = b // zweiter Summand
n3 = 0
while n3 != a
n2 = n2 + 1
n3 = n3 + 1
end // Ende der while-Schleife
// n2 ist jetzt die Summe von a und b
Es gibt nen Trick dabei. 1. Man sieht das erhöht/verringert (und verglichen) werden kann, 2… den behalt ich für mich, 3. Analogie/Gleichnis mit Stock und Wolle. Grüße an TO.
Edit: Die Laufzeit wäre ja n (wenn n die Größe der größeren natürlichen Zahl ist).
n1 = a // erster Summand
n2 = b // zweiter Summand
while n1 != 0
n1 = n1 - 1
n2 = n2 + 1
end
// n2 ist jetzt die Summe von a und b
Hier kann man auch gut die Invariante erkennen: Die Gesamtsumme bleibt bei jedem Schleifendurchlauf gleich. Deshalb muss, wenn man n1 auf 0 heruntersubtrahiert hat, am Ende alles in n2 stecken. Diese Idee kann man auch recht einfach rekursiv formulieren:
function summe(n1, n2)
if n1 == 0
return n2
else
return summe(n1-1, n2+1)
end