Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Was tut diese Methode? und wie müssen die assertions aussehen?
die Aufgabenstellung
- Welchen Wert berechnet diese Methode?
- Für Q und R geeignete assert-Anweisungen angeben
Java:
static int f(int m, int n) {
assert m <= n; //Vorbedingung P
int s = m+n;
int i = m;
// assert //Schleifeninvariante Q
while(i <= n) {
s = s -2*i;
i = i+1;
//assert //Schleifeninvariante Q
}
//assert //Nachbedingung R
return s;
}
Wenn m = n ist dann kommt immer 0 raus!
Wenn m < n kommt es drauf an. Für n = 12
m = 0: 12*12 = -144
m = 1: 13*11 = -143
m = 2: 14*10 = -140
m = 3: 15*9 = - 135
und so weiter!!! m+1,n-1
Welcher Wert soll das nun aber sein?
Q = s - 2*(m)-2*(m-1)-2(m-2)-...-2(m-n) müsste die Invariante sein,
statt s setze auch (m+n),
Q = (m+n) - 2*(m)-2*(m-1)-2(m-2)-...-2(m-n),
und das wäre dann, wenn mich nicht alles täuscht...:
Q = n - (m)-2*(m-1)-2(m-2)-...-2(m-n).
Komisch ich bin nicht Benachrichtigt worden das du geantwortet hast auf die Frage
Ist das ganze wirklich so Kompliziert ???
Was berechnet die Funktion jetzt die Sattelfläche?
s == m + n - 2 * (n * (n + 1) / 2 - (m - 1) * m / 2) // <- https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF']https://en.wikipedia.org/wiki/1_+_2_+_3_+_4_+_⋯
s == m + n - (n * (n + 1) - (m - 1) * m)
s == m + n - (n*n + n - m*m + m)
s == (m - n) * (m + n)
Noch etwas zur Erklärung meiner obigen Herangehensweise:
Die Idee ist, dass die Schleife ja effektiv eine Summe berechnet, die von `s` abgezogen wird. Wenn wir mal das `2 *` und die Subtraktion ausklammern, dann wird in der Schleife einfach die Summe von `m+(m+1)+(m+2)+(m+3)+...(m+n-m)` berechnet. Der nächste Schritt ist, dass wir diese Summe nun in zwei Teilsummen ausdrücken. Bei der Summe der `m`s sehen wir, dass das nichts anderes ist als `m` Mal die Anzahl der `m`s, welches (n-m+1) ist. Also: `(n-m+1)*m` und `1+2+3+4+..+(n-m)`.
Nun sollte bekannt sein, dass die Folge `1+2+3+4+5+..+N` über die Gaußsche Summenformel: `N * (N + 1) / 2` ausgedrückt werden kann.
Das heißt, eingesetzt in die Summenformel ergibt sich insgesamt:
`(n-m+1)*m + (n-m+1)*(n-m)/2`.
Nun kommt noch das `2 *` und die Subtraktion hinzu:
`-2 * ((n-m+1)*m + (n-m+1)*(n-m)/2)`.
Das ist die Summe, die effektiv von `s` innerhalb der Schleife abgezogen wird.
Da `s` vorher ja `m+n` war, ist `s` nachher insgesamt:
`m+n - 2 * ((n-m+1)*m + (n-m+1)*(n-m)/2)`.
Und das kann man schlussendlich mit der dritten binomischen Formel vereinfachen.
Vielen Lieben Dank
Hab es nun verstanden
Leider muss ich Schreckens fest stellen das vieles aus Mathe wieder abhanden gekommen ist!!! Also muss ich dort später wieder auffrischen
Und das ist IMO falsch: die Summe der Invariante darf nur bis i-1 gehen, außerdem gehört zur Invariante die Bedingung i<=n. Durch die Abbruchbedingung wird daraus i=n+1, so dass die Summe in s dann tatsächlich von m bis einschließlich n geht.
Die Invariante gilt vor, nach und während der Schleife (vor: bevor sie startet, nach: wenn fertig, während: entweder vor oder nach dem Inkrement) - daran ist nichts falsch, jetzt Spiel Dich nicht so auf... schlägt die Hitze schon auf den Kopf?
Du hast z. T. Recht: die Schleifenbedingung ist nicht Teil der Invariante. Ansonsten muss die Invariante vor der Schleife, am Anfang und am Ende jedes Schleifendurchlaufs sowie nach der Schleife gelten. Nach der Schleife gilt aber i = n+1, so dass die in der Invarianten die Summe nur bis i-1 gebildet werden darf.
Bei mir sind die 32 Grad auch schon überschritten, danach schaltet mein Gehirn in so eine Art Stand-by um
Aber... seid gewarnt (und gut darauf vorbereitet)... Donnerstag voraussichtlich teils bis zu 40 Grad. Die heiße Luft kommt aus Spanien/Portugal herüber und trifft der Vorhersage sogar Holland....