Pascalsche Dreieck rekursiv funktional

Aufrufe: 645     Aktiv: 27.09.2020 um 10:14

0

Hallo zusammen

Nun soll ich die rekursive Funktion ausrechnen. c steht für Spalte und r steht für Zeile

Folgende Formel Berechnung verstehe ich nicht ganz.

Wenn ich z.B. pascal(1,3) habe, dann ergibt es 3

(1,3) setze ich nun in die obige Funktion ein.

def pascal(1,3)

if(1 ==0 || 3 ==0) then 1 -> stimmt nicht, deshalb gehe ich in den else Teil

pascal(1-1, 3-1) + pascal(1,3-1) -> ergibt = pascal(0,2) + pascal(1,2) genau hier, ich müsste doch die beiden Berechungen zusammenrechnen, dann würde es doch pascal(1,4) ergeben. Stimmt das?

if stimmt immer noch nicht deshalb gehe ich in den else part

pascal(1-1, 4-1) + pascal(1,4-1) = pascal(0,3) + pascal(1,3) = pascal(1,6)

 

Was mache ich falsch? Warum kann man den else part überhaupt nochmals durchgehen, obwohl es keine for oder while schleife gibt?

 

Vielen Dank

 

Diese Frage melden
gefragt

Student, Punkte: 205

 
Kommentar schreiben
2 Antworten
0

Nein, du machst den Fehler, dass du bei zwei Summanden der Form 

\( pascal(a,b) + pascal(c,d) \)

nicht einfach die Argumente addieren kannst! Das ist hier kein additiver Operator!

\( pascal(a,b) + pascal(c,d) \neq pascal(a+c,b+d) \)

Stattdessen musst du für beide Summanden einzeln die Funktion aufrufen und den tatsächlichen integer Wert ausrechen oder eben wieder in Summanden zerteilen, für die du auch wieder einzeln die Funktion aufrufst.

 

Ich hoffe du konntest mir folgen, sonst gern nochmal nachfragen.

Diese Antwort melden
geantwortet

Student, Punkte: 2.18K

 

vielen Dank für deine Antwort. Nun verstehe ich, dass die Werte innerhalb der Klammer nicht addierbar sind.
pascal(a,b) + pascal(c,d) = pascal(a + b, b+d)

Wenn der Wert (2,3) gesucht ist, wäre doch im pascalschen dreieck = 3

if (c== 0) || (r==0)
else pascal(2-1, 3-1) + (2,3-1) = pascal (1,2) + pascal(2,2) muss ich die jetzt einzelnen wieder durch den else part berechnen?

else part für (1,2)
else pascal(1-1, 2-1) + (1, 2-1) = pascal(0,1) + pascal(1,1) = 1 + pascal(1,1)

else part für (2,2)
else pascal(2-1,2-1) + (2,2-1) = pascal(1,1) + pascal(2,1)

else part für (1,1)
else pascal(1-1, 1-1) + (1,1-1) = pascal(0,0) + pascal (1,0) -> 1

stimmt der Ansatz nun?
  ─   sayuri 27.09.2020 um 09:45

Kommentar schreiben

0

Ich weiß nicht, wie du auf pascal(1,4) und pascal(1,6) kommst.

Die Rekursionsformel lautet: pascal(c,r) = pascal(c-1,r-1) + pascal(c,r-1) und die ist hier auch richtig implementiert. 

Z.B. pascal(1,3) = pascal(0,2) + pascal(1,2)  = 1 + pascal(1,2)

pascal(1,2) = pascal(0,1) + pascal(1,1) = 1 + pascal(1,1) 

pascal(1,1) = pascal(0,0) + pascal(1,0) = 1 + 1 = 2???

Bis auf die letzte Zeile ist das richtig. Die Rekursion ist richtig, aber nicht die Verankerung bei 0. 

Korrekt würde es (glaube ich), wenn die if-Abfrage wäre: if (c==0 || r==c)...

Und zum "else part nochmal durchgehen": So kann man das nicht sehen. Es ist ein rekursives Programm, das sich selbst aufruft (zweimal sogar). Das ganze Programm  wird also nochmal aufgerufen. Es wird nicht nur ein statement nochmal durchlaufen.

 

Diese Antwort melden
geantwortet

Lehrer/Professor, Punkte: 38.93K

 

vielen Dank für deine Antwort! Also d.h. das Programm wird solange aufgerufen, bis es die Bedingung erfüllt oder?   ─   sayuri 27.09.2020 um 09:47

Leider scheint diese Antwort Unstimmigkeiten zu enthalten und muss korrigiert werden. Mikn wurde bereits informiert.