Was tut diese Methode? und wie müssen die assertions aussehen?

Guten Tag zusammen,

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?

LG
 
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 :D ???
Was berechnet die Funktion jetzt die Sattelfläche?
 
Java:
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.
 
Hier noch "the last mile" bis zur Vereinfachung des gesamten Terms:

Ausgang:
`m + n - 2 * ((n - m + 1) * m + (n - m + 1) * (n - m) / 2)`

`2* und /2` im letzten Summanden ausmultiplizieren:
`m + n - 2 * (n - m + 1) * m - (n - m + 1) * (n - m)`

`(n - m + 1)` ausfaktorisieren:
`m + n - (n - m + 1) * (2 * m + (n - m))`

letzten Faktor vereinfachen:
`m + n - (n - m + 1) * (m + n)`

`+1` in Multiplikation durch Addition von `(m+n)` ersetzen:
`m + n - (n - m) * (m + n) - (m + n)`

`erstes m+n und letztes -(m+n)` heben sich auf:
`-(n - m) * (m + n)`

Negation in die Summe hineinmultiplizieren:
`(m - n) * (m + n)`
 
Naja, `(m - n) * (m + n)` ist ja bereits die dritte binomische Formel. Diese auszumultiplizieren würde das Ganze ja nur komplizierter machen. :)
 
@mihe7 Ja das ist das was ich auch geschrieben hatte, nur Du hast es in der Summenschreibweise

Die Summe geht nicht hoch bis n, sondern nur bis i ;)

Die Nachbedingung R wäre einfach m²-n²
 
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 :)
 
Naja, diese Invariante hatte jetzt nicht den mathematisch höchsten Anspruch...

@httpdigest Wenn ich mich nicht täuschen, so hätte man auch mit dem kleinen Gauß (also die gaußsche Summenformel) darauf kommen können.
 
@mihe7 Ja das ist das was ich auch geschrieben hatte, nur Du hast es in der Summenschreibweise

Die Summe geht nicht hoch bis n, sondern nur bis i ;)
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.
 
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.

jetzt Spiel Dich nicht so auf... schlägt die Hitze schon auf den Kopf?
Das liegt durchaus im Bereich des Möglichen :)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben