2015-12-25 10 views
5

In meinem Kurs über objektorientierte Programmierung haben wir ein Thema besprochen, von dem ich nicht glaube, dass er es jemals genannt hat. Ich habe versucht herauszufinden, wie es heißt, einen richtigen Weg zu finden, um diese zu lösen, aber ich hatte kein Glück.Wie oft wird dieser Schleifenkörper wiederholt?

Dies ist keine Hausaufgabe, sondern eine Frage zur Klärung des Prozesses zur Lösung dieses Problems.

for I = (N + 2) downto -1 
    for J = (I - 1) to (N + 4) 
     // Code is run here 

Die Frage ist "Wie oft ist // Code is run here lief?" Hier

ist, was ich habe versucht, dieses Problem zu lösen:

1) I = (N + 2), J = [(N + 2) - 1] von diesem (und was ich mich erinnere) Sie verwenden b - a - 1 für die Anzahl der Male ausgeführt zu lösen, die uns X = [(N + 2) - 1] - (N + 2) - 1 gibt, die sein kann,

2) I = -1, J = ((-1) bis X = -2 vereinfacht - 1) and X = ((-1) - 1) - (-1) - 1 which simplifies to X = -2`

I‘ Ich verliere mich im Umgang mit dem zweite for Schleife und wie das Problem zu beenden. Ich weiß, dass wir am Ende mit einer Antwort wie r(r + 1)/2

Ich möchte nur sagen, dass ich versucht habe, nach einem Namen dieser Art von Technik zu suchen, aber er nannte es einfach "Code Counting", die nicht t Geben Sie alle Suchanfragen zurück, die sich auf dieses Thema beziehen.

Danke

EDIT: Dieser Kurs in Java war, so dass ist, warum ich den Java-Tag für diese Frage verwendet, wenn jemand neugierig ist.

EDIT2: Um zu klären, dies auf einer schriftliche Prüfung, war so von uns erwartet dies über Stift und Papier zu tun, würde ich eine Erklärung mag, wie diese Frage zu lösen, wie ich es versucht habe, oft und immer noch mit der falschen Antwort enden.

+0

sind die 'to' Grenzen inklusive? – luk2302

+0

Kannst du nicht einfach den klassischen Physiker-Ansatz machen, um die Antwort zu bekommen und rückwärts zu arbeiten? Setzen Sie einfach einen Zähler in die Schleife I, isolieren Sie dann die Schleife J und machen Sie dasselbe. Hoffentlich sollte Ihnen ein Zähler in der Schleife IJ den Zähler in J * in I geben. – user2589273

+0

Meinst du, O-Notation? – gian1200

Antwort

3

Schauen Sie sich einfach den "Code" an und beginnen Sie logisch zu zählen. In der ersten Iteration der äußeren Schleife (OL genannt) führst du die innere Schleife (IL) (N + 4) - (N + 2 - 1) + 1 mal = 4 mal aus.

Erklärung der +1: Wenn wir die Schleife von -1 bis 2 ausführen, führen wir es tatsächlich 4 mal: -1, 0, 1, 2, was in Mathematik ist 2 - (-1) + 1.

Das nächste mal , deshalb läuft die IL (N + 4) - (N + 1 - 1) + 1 mal = 5 mal. Dasselbe gilt für den nächsten Schritt und den darauffolgenden Schritt. Die Zeiten, zu denen die AWL ausgeführt wird, werden jedes Mal um eins erhöht: 4 + 5 + 6 + .... Die Frage ist, wie weit wir gehen.

Der letzte Schritt ist I = -1, dort wird IL (N + 4) - (-1 - 1) + 1 = N + 7 mal ausgeführt.

Die Summe, die Sie suchen, scheint daher 4 + 5 + 6 + ... + (N + 6) + (N + 7) zu sein. In der Tat ist so etwas wie r(r + 1)/2 mit ein paar Subtraktionen und Ergänzungen.

Die obigen Zahlen gehen davon aus, dass die to Grenzen inklusive sind.

Hinweis: Wenn Sie ein Formular erstellen, wählen Sie den Eingabeparameter als klein (wie 0 oder 1) und überprüfen Sie, ob die Formel für diesen Wert funktioniert.

Summieren der Werte mit der kleinen Gaußschen Formel r * (r + 1)/2 haben wir r -> N + 7. Und deshalb (N + 7) * (N + 8)/2. Aber dann zählen wir die 3, 2 und 1 als auch, was eigentlich nicht in der obigen Liste ist, müssen wir sie subtrahieren und kommen zu der Endlösung:

(N + 7) * (N + 8)/2 - 6 
+0

Ich habe die Antwort auf diese Frage unter Ihrem Kommentar zu meinem ursprünglichen Beitrag geschrieben, die Antwort soll sein: '[(N + 7) (N + 8)/2 ] - 6', aber ich bin nicht in der Lage, das herauszufinden. – liquidsystem

+1

@liquidsystem naja, meine derzeitige Lösung wäre '(N + 6) (N + 7)/2 - 3' was ziemlich verdammt nah ist. Ich vermute, der Unterschied ist die genaue Frage, die ich zuvor über die Einbeziehung der Grenzen gestellt habe. – luk2302

+0

Wir haben nie darüber diskutiert, ob er uns Probleme einschliesslich oder exklusiv geben würde, also würde ich gerne annehmen, dass es exklusiv ist. Außerdem habe ich mich gefragt, ob die Gleichung, die er uns gegeben hat, "b-a-1" richtig ist und wie man das verwendet, um die Zeit zu verkürzen, die man braucht, um durch diese Schleife zu gehen. – liquidsystem

1

Der Algorithmus wie in der Frage sieht gezeigt wie die gute alte Basic-Syntax

for X down/to Y, that includes Y 

die äußere Schleife geht von n+2 zu -1, so dass die innere Schleife

n+1 to n+4 => 4 iterations 
... 
-2 to n+4 => n+7 iterations 

alle diese geht Summieren, bekommen wir

n+3 
∑ (4+i) = 4(n+4) + (n+3)(n+4)/2 
i=0 
      = (n+11)(n+4)/2 

die auch gleich (N + 7)(N + 8)/2 - 6 ist

+0

Richtig, nur die allgemeine Idee, dies zum Auswendiglernen in meinen Kopf zu bekommen, ist der knifflige Teil, da wir diese Idee nur kurz diskutierten und dann mit anderen Themen fortfuhren, es war ein Schmerz, weil die letzten Quizfragen Fragen wie dieser und brachte mich dazu, Punkte zu verlieren! – liquidsystem

+0

Der schwierigste Teil besteht darin, bei der Berechnung der inneren Iteration keinen Fehler zu machen, dann wird für diese Art von Problem die Gleichung 'Summe (1 bis N) = N (N + 1)/2' sehr oft verwendet. Dies ist wahrscheinlich die wichtigste zu beachtende Gleichung. –