2017-08-25 1 views
-1

Ich machte eine Übung aus John Zelles Buch über Python, er bat, die Fibonacci-Sequenz mit einer Loop-Funktion zu machen.Was eine Solitaire negative Zahl auf der Strecke tut?

Nachdem ich es nicht geschafft, um es getan, habe ich einen Blick auf seine Auflösung, die dies war:

n = int(input("Enter the value of n: ")) 
curr, prev = 1, 1 
for i in range(n-2): 
    curr, prev = curr+prev, curr 
print("The nth Fibonacci number is", curr) 

Während ich ein Teil verstanden, was er getan hat, der Teil, den ich verpasst wurde der (n-2) Bereich.

Ich habe hier auf Stackoverflow einen Blick darauf geworfen und Leute sagen, dass eine negative Zahl auf dem Bereich zurück zum Ende der Liste geht. Wenn der Benutzer in diesem Fall jedoch 1 anfordert, lautet das Ergebnis range(-1).

Meine Vermutung war, dass der Autor das tat, so dass die for-Schleife die ersten beiden Werte der Fibonacci-Sequenz nicht summierte, da sie beide 1 sind, und erst nachdem der Benutzer 2 und höher auffordert, beginnt die Schleife tatsächlich summieren. Bin ich richtig?

+0

Ja. 'range (-x)' oder 'range (0)' ergibt nichts. – kindall

+4

Das konnte man leicht testen, oder? – trincot

+0

Lesen Sie die [Dokumente] (https://docs.python.org/3/). Die meisten integrierten Python-Funktionen befinden sich unter [Funktionen] (https://docs.python.org/3/library/functions.html#func-range). Die Details für Bereiche und andere integrierte Objekte sind meist in [Built-In Types] (https://docs.python.org/3/library/stdtypes.html#typesseq-range). –

Antwort

1

Wenn Sie 0 oder 1 für dieses eingeben, wird der Code nicht die Schleife eingeben, und das Ergebnis ist der Anfangswert von curr, dass seine . Für jeden höheren Wert berechnet die Schleife den richtigen Wert iterativ.

Ihr Speicher negativer Werte ist ein wenig aus: ein negativer Index aus dem entgegengesetzten Ende einer iterable (z.B. Liste Tupel, string) arbeiten. A Bereich ist nicht ganz in dieser Klasse; Das Ergebnis ist in diesem Fall ein leerer Bereich.


KLARSTELLUNG nach OP Kommentar

Ich sehe Ihre Verwirrung. Bereich gibt ein iterables der angegebenen Werte zurück. Es sieht jedoch so aus, als hätten Sie die Grenzen mit dem Index verwechselt. Lassen Sie uns mit einer allgemeinen Form arbeiten:

r = range(left, right, step) 
r[pos] 

links * standardmäßig auf 0; ** Schritt standardmäßig 1

Hier sind einige Beispiele:

>>> r = range(0, 20, 2) 
>>> r[-1] 
18 
>>> r = range(0, -1) 
>>> r 
[] 
>>> r = range(0, -10, -2) 
>>> r 
[0, -2, -4, -6, -8] 
>>> r[-2] 
-6 

Beachten Sie die zweiten und dritten Beispiel, wo wir negative Werte für Endpunkte verwenden. Es wird zwischen einem negativen Endpunkt und einem negativen Index unterschieden. Der Endpunkt wird zum Erstellen der Liste verwendet. Wenn die Endpunkte nicht in der vom Schritt angegebenen Reihenfolge liegen, ist der resultierende Bereich die leere Liste. Bereich (0, -1) ist ein solches Beispiel.

Sobald die Liste erstellt wird, wie beispielsweise mit Bereich (0, 20, 2), dann ein Verweis in diese Liste mit negativem Index wird vom rechten Ende der Liste zählen.Beachten Sie das dritte Beispiel, indem Sie eine Liste erstellen, die "rückwärts" geht, 0 bis -8. Ein negativer Index funktioniert in diesem Fall auch von rechts. Der negative Wert am rechten Ende, der negative Schritt und der negative Index sind drei unterschiedliche Verwendungen.

Macht das alles klar?

+0

Danke für die Antwort und zur Klärung des Index/Bereichs negative Werte Fehler! – Kalienov

+0

Nur so verstehe ich das gerade, ich schaute auf den 4.6.6 Abschnitt über eingebaute Typen und es sagt: "Bereiche unterstützen negative Indizes, aber diese werden interpretiert als Indizierung vom Ende der Sequenz bestimmt durch die positiven Indizes . " und es gibt ein Beispiel: r = Bereich (0, 20, 2) und dann ist r [-1] gleich 18. Also ist das in diesem Beispiel ein iterabler Wert? – Kalienov

1
>>> range(-1) 
range(0, -1) 

So ist die für die Schleife eingegeben wird, nicht, wenn n 1 oder 2 und curr ist (die auf 1 gesetzt ist), ist das Ergebnis.