Pascalsche Dreieck rekursiv funktional

Aufrufe: 76     Aktiv: vor 2 Monaten, 1 Woche

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

 

gefragt vor 2 Monaten, 1 Woche
s
sayuri,
Student, Punkte: 108

 
Kommentar schreiben Diese Frage melden
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.

geantwortet vor 2 Monaten, 1 Woche
jojoliese
Student, Punkte: 1.17K
 

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, vor 2 Monaten, 1 Woche
Kommentar schreiben Diese Antwort melden
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.

 

geantwortet vor 2 Monaten, 1 Woche
m
mikn
Lehrer/Professor, Punkte: 8.37K
 

vielen Dank für deine Antwort! Also d.h. das Programm wird solange aufgerufen, bis es die Bedingung erfüllt oder?   ─   sayuri, vor 2 Monaten, 1 Woche

Das Programm ruft sich selbst auf, bis die Bedingung für "then 1" erfüllt ist. Der Benutzer ruft es nur einmal auf.   ─   mikn, vor 2 Monaten, 1 Woche
Kommentar schreiben Diese Antwort melden