2016-10-12 6 views
1

Ich bin neu in Python und Stackoverflow. Ich habe versucht, das "While-Loop" -Beispiel von Pyschools für die Quadratwurzelnäherung zu lösen (Thema 5: Frage 9). Ich kann jedoch nicht die gewünschte Ausgabe erhalten. Ich bin mir nicht sicher, ob dieses Problem mit der Schleife oder der Formel zusammenhängt. Hier ist die Frage:pyschools Quadratwurzel Approximation

Erstellen Sie eine Funktion, die in einer positiven Zahl nimmt und zurück 2 ganze Zahlen, so dass die Zahl zwischen den Quadraten der 2 ganzen Zahlen ist. Sie gibt dieselbe Ganzzahl zweimal zurück, wenn die Zahl ein Quadrat einer Ganzzahl ist.


Beispiele:

sqApprox(2) 
(1, 2) 
sqApprox(4) 
(2, 2) 
sqApprox(5.1) 
(2, 3) 

Hier ist mein Code:


def sqApprox(num): 
    i = 0 
    minsq = 1       # set lower bound 
    maxsq = minsq      # set upper bound 
    while i*i<=num:      # set 'while' termination condition 
     if i*i<=num and i >=minsq: # complete inequality condition 
      minsq = i 
     if i*i<=num and i <=maxsq: # complete inequality condition 
      maxsq = i 
     i=i+1      # update i so that 'while' will terminate 
    return (minsq, maxsq) 

Wenn ich diese Funktion sqApprox(4) und nennen es auf IDE erstellen, erhalte ich auszahlen ut (2, 0).

Könnte mir bitte jemand sagen, was ich falsch mache? Danke im Voraus. Diese

+0

formatieren Code beginnen mit einer leeren Zeile, dann fügen Sie vier Leerzeichen an den Anfang jeder Zeile des Codes, dann lassen Sie eine leere Zeile am Ende – Amias

+1

Warum nicht vergessen 'minsq' und' maxsq' und einfach zurück '(i- 1, i) 'oder' (i-1, i-1) '(abhängig davon, ob es ein perfektes Quadrat ist oder nicht)? Alles, was Sie tun müssen, ist das letzte 'i' mit' i * i <= num' zu finden, und Sie können das mit einer 1-zeiligen While-Schleife machen. –

Antwort

1

ist, warum Ihr Code tut, was sie tut:

Nachdem die Linie maxsq = minsq ausgeführt wird, diese beiden Werte sind 1.

Wenn wir

while i*i<=num:      # set 'while' termination condition 
    if i*i<=num and i >=minsq: # complete inequality condition 
     minsq = i 
    if i*i<=num and i <=maxsq: # complete inequality condition 
     maxsq = i 
    i=i+1      # update i so that 'while' will terminate 

zunächst auf die Schleife kommen Beachten Sie, dass innerhalb der Schleife i*i<=num, so dass es nicht notwendig ist, es erneut zu testen. So ist es äquivalent zu:

while i*i<=num: 
    if i >=minsq: 
     minsq = i 
    if i <=maxsq: 
     maxsq = i 
    i=i+1 

Im ersten Durchlauf durch die Schleife i == 0maxsq == 1 aber die zweite Bedingung wahr macht, daher maxsq gleich dem aktuellen Wert von i Einstellung, die 0. In nachfolgenden Durchgängen durch die ist Schleife, i <= maxsq ist falsch (seit maxsq == 0 aber i > 0) daher maxsq wird nie über 0 hinaus verschoben. Auf der anderen Seite aktualisiert die erste Bedingung in der While-Schleife minsq wie vorgesehen aktualisiert.

Ich würde empfehlen, sowohl minsq als auch maxsq vollständig zu vergessen. Haben die Schleife einfach sein:

while i*i <= num: 
    i += 1 #shortcut for i = i + 1 

Wenn die Schleife Ausführung erfolgt, ein einfacher Test beteiligt i-1 genug ist, um zu bestimmen, was zurückzukehren.

+0

Danke das hat geholfen. –

Verwandte Themen