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?

-1
Ratana 18 Aug. 2020 im 19:11

4 Antworten

Beste Antwort

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

0
Mateus Terra 18 Aug. 2020 im 16:21

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.

0
alani 18 Aug. 2020 im 16:50

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.

0
Sylwester 18 Aug. 2020 im 16:18

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 ..

0
Nitin 18 Aug. 2020 im 16:17