Ich habe versucht, eine rekursive Funktion zum Erzeugen des Pascal-Dreiecks wie folgt zu erstellen.
numRows = 5
ans=[[1],[1,1]]
def pascal(arr,pre,idx):
if idx==numRows:
return ans
if len(arr)!=idx:
for i in range (0,len(pre)-1,1):
arr+=[pre[i]+pre[i+1]]
if len(arr)==idx:
arr+=[1]
ans.append(arr)
pascal([1],arr,idx+1)
a = pascal([1],ans[1],2)
return a
Die Ausgabe, die ich erhielt, war eine leere Liste [ ]
. Aber wenn ich beim Aufruf von pascal
als return
hinzufüge
return pascal([1],arr,idx+1)
Die Ausgabe war korrekt [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
.
Soweit ich weiß, sollte a
von return ans
zugewiesen worden sein. Warum konnte a
beim Aufrufen von pascal
ohne return
keine Antwort erhalten und warum ist return
in diesem Fall erforderlich?
4 Antworten
Wenn Sie eine Rekursion haben, kombinieren Sie die Renditen normalerweise auf irgendeine Weise. Könnte eine Summe sein, wie Fibonacci:
fibonacci(n+1) = fibonnaci(n)+fibonacci(n-1)
Oder fügen Sie eine Zeile an eine Matrix an, wie in Ihrem Fall. Wie auch immer, wenn Sie keine Rückgabe haben, haben Sie keine Informationen zu kombinieren! Betrachten Sie den Fibonnaci-Fall ohne Rückgabe:
def fibonnaci(n):
if n<2:
return 1
fib_ans = fibonnaci(n-2)+fibonnaci(n-1)
Wenn ich in diesem Fall fibonnaci(0)
oder fibonnaci(1)
aufrufe, wäre die Ausgabe 1, so wie Sie ans zurückgeben, wenn idx == numRows, aber wenn ich fibonnaci(2)
aufrufe, würde die Variable fib_ans empfangen 2, was die erwartete Antwort ist, aber außerhalb des Funktionsumfangs verfügbar wäre. Python "würde" return None
am Ende meiner Funktion direkt unter der Zuordnung von fib_ans hinzufügen. Also muss ich fib_ans zurückgeben
Wenn Sie pascal([1],arr,idx+1)
ausführen, führen Sie den rekursiven Aufruf aus, verwerfen dann jedoch den zurückgegebenen Wert. Wenn Sie es an den Anrufer zurückgeben möchten, müssen Sie explizit return pascal(...)
verwenden.
Tatsächlich ist in diesem Beispiel eine Rekursion ohnehin nicht erforderlich. Sie können Ihren Code leicht umgestalten, um eine einfache for
- Schleife zu verwenden. Zum Beispiel:
def pascal(numRows):
ans = [[1]]
for _ in range(1, numRows):
pre = ans[-1]
arr = [1]
for i in range(0,len(pre)-1,1):
arr+=[pre[i]+pre[i+1]]
arr+=[1]
ans.append(arr)
return ans
print(pascal(5))
(Ich verwende hier den Namen _
als for
Schleifenvariable gemäß Konvention, da es sich um eine Dummy-Variable handelt, die nicht innerhalb der Schleife verwendet wird, aber Sie könnten etwas anderes verwenden, z. B. row
if Sie bevorzugen.)
Das Obige kommt dem ursprünglichen Code so nahe wie möglich, aber Sie sollten auch in Betracht ziehen, arr.append(value)
anstelle von arr += [value]
zu verwenden. Dies ist die normale Methode, um einen einzelnen Wert an eine Liste anzuhängen.
Für alle Algolsprachen mit dem Schlüsselwort return
wird die nächste Funktion vollständig beendet und das Ergebnis ist das Ergebnis des Ausdrucks des Rückgabearguments. z.B.
def test(v):
if v == 0:
return someFun(10)
...
Wenn v
Null ist, ist das Ergebnis der Funktion der von someFun(10)
zurückgegebene Wert. Der Rest der mit ... bezeichneten Funktion wird niemals ausgeführt, es sei denn, v
ist ungleich Null.
Wenn wir dasselbe ohne return
schreiben:
def test(v):
if v == 0:
someFun(10)
...
Wenn nun v
Null ist, wird someFun(10)
immer noch aufgerufen, aber der von ihm zurückgegebene Wert wird verworfen und damit er eine wahre Bedeutung hat, muss someFun
benötigt werden einige Nebenwirkungen wie Drucken, Speichern von Werten, Aktualisieren von Objekten. Außerdem wird der gesamte Rest der mit ... bezeichneten Funktion fortgesetzt, sobald someFun(10)
abgeschlossen ist.
Für Python und viele andere Sprachen bedeutet das Fehlen eines return
überhaupt nicht, dass nichts zurückgegeben wird. In Python befindet sich in der letzten Zeile jeder Funktion / Methode ein unsichtbares return None
.
Soweit ich weiß, benötigen Sie die "return" -Anweisung, wenn Sie einen Wert zurückerhalten möchten ...
Der Punkt ist, wenn Sie keine "Rückkehr" haben, erhalten Sie keine Werte zurück ...
Hoffentlich hilft das ..
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.