www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

constructor

Gepostet:
20.06.2010 14:27

Rekursion an einem Beispiel  
Hallo habe eine frage zu rekursiven funktionsaufrufen.

Beispiel:

liste = [0,1,2,3,4,5,6]

p [] = 3000
p [e] = e
p (a:b:r) = p r + a+b + p r

test = (p liste)

wenn ich einen aufruf von test durchspiele:

p aufgerufen mit [0,1,2,3,4,5,6]
==> dritte funktion wird aufgerufen ==> a=0, b=1, r=[2,3,4,5,6]
==> p wird mit r aufegrufen ==> dritte funktion wird aufgerufen ==> a=2,b=3,r=[4,5,6]
==> p wird mit r aufgerufen ==> entspricht noch immer der dritten funktion ==> a=4,b=5,r=[6]
==> p wird mit r aufgerufen ==> entspricht jetzt der zweiten funktion ==> 6 wird zurückgegeben.

das heißt nun das die erste rekursion auffolge, nämlcih der aufruf von p r fertig ist und den wert 6 ergibt.
nun gehts weiter zu a+b.
jetzt muss ich der rekursion entlang die werte von a und b addieren. (4+5) + (2+4) + (0+1) = 16
also hätten wir jetzt bis hier her p r + a+b den wert 22.
die dritte funktion geht aber noch weiter nämlich wird nochmal + p r dazu addiert . p r ergibt ja 6. dh. 22 + 6 = 28.

Leider müsste hier aber 95 rauskommen und nicht 28.
Wo ist mein denkfehler?

lg

Zum Seitenanfang    
 
Siracusa

Gepostet:
20.06.2010 19:29

   
Das Problem ist, (p r) wird in jeder Rekursion zweimal aufgerufen, dazu noch a+b. Davon hast du einige vergessen.

test
= p [0,1,2,3,4,5,6]
= (p [2,3,4,5,6]) + 0+1 + (p [2,3,4,5,6])
= (p [4,5,6] + 2+3 + p [4,5,6]) + 0+1 + (...)
= ( (p [6] + 4+5 + p [6]) + 2+3 + (p [6] + 4+5 + p [6]) ) + 0+1 + (...)
= ( (6+4+5+6) + 2+3 + (6+4+5+6) ) + 0+1 + (...)
= (21+5+21) + 0+1 + (...)
= 47 + 1 + (47)  -- die 47 hinten ist das gleiche wie vorn
= 95


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
constructor

Gepostet:
20.06.2010 21:24

   
= p [0,1,2,3,4,5,6]
= (p [2,3,4,5,6]) + 0+1 + (p [2,3,4,5,6])
= (p [4,5,6] + 2+3 + p [4,5,6]) + 0+1 + (...)
= ( (p [6] + 4+5 + p [6]) + 2+3 + (p [6] + 4+5 + p [6]) ) + 0+1 + (...)
= ( (6+4+5+6) + 2+3 + (6+4+5+6) ) + 0+1 + (...)
= (21+5+21) + 0+1 + (...)
= 47 + 1 + (47) -- die 47 hinten ist das gleiche wie vorn
= 95

also in der zweiten zeile ist p l + a+b + p l angegeben und ab der dritten zeile entsprechen die (...) dem zweiten rekursionsaufruf in der zeile und müssten eigentlich gleich ausschauen wie das was vor dem (...) alles steht.
das hoff ich zumindes mal :-D
Zum Seitenanfang    
 
Siracusa

Gepostet:
20.06.2010 22:13

   
Nicht ganz alles was vor dem (...) steht, aber alles was zum rekursiven Aufruf von (p l) gehört. Das a+b taucht ja nur einmal auf, also das ist dann hinten nicht nochmal dabei.
Zum Seitenanfang    
 
constructor

Gepostet:
20.06.2010 22:32

   
ok... nun, da ich es mir ausführlich auf einem zettel aufgeschrieben habe komme ich aufs ergebnis 95 :)
Aber so ausm Kopf heraus ist das schon etwas.... naja... wenn man nicht täglich mit rekursion zu tun hat....
danke für die hilfe
Zum Seitenanfang    
 
constructor

Gepostet:
20.06.2010 23:53

   
Bei diesem beispiel würd ich folgendermaßen vorgehen:

mnr = [0,5,1,6,4,3,3]

p [] = 5000
p [e] = e
p (a:b:l)
| a <= b = p (b:l)
p (a:l) = p l + a + p l
t7 = ( p mnr)


--------------------

p[0,5,1,6,4,3,3]
=p[5,1,6,4,3,3]
=p[1,6,4,3,3] + 5 + p[1,6,4,3,3]
=p[6,4,3,3] + 5 + p[6,4,3,3]
=p[4,3,3] + 6 + p[4,3,3] + 5 + (...)
=p[3,3] + 4 + p[3,3] + 6 + p[3,3] + 4 + p[3,3] + 5 + (...)
=(p[3] + 3 + p[3]) + 4 + (p[3] + 3 + p[3]) + 6 + (p[3] + 3 + p[3]) + 4 + (p[3] + 3 + p[3]) + 5 + (...)
= 97

laut interpreter sollte hier aber 57 rauskommen.

siehst du wo ich mich verirre?
Zum Seitenanfang    
 
Siracusa

Gepostet:
21.06.2010 18:04

   
(p [3,3]) löst du zu (p [3] + 3 + p [3]) auf, es sollte aber zu (p [3]) und dann zu 3 abgeleitet werden, denn im Guard von p steht "a kleiner gleich b".
Zum Seitenanfang    
 
constructor

Gepostet:
21.06.2010 18:53

   
Okay nun komme ich auch auf 57.
Mein Fehler war dass ich mir nicht gedacht habe dass ein aufruf mit p[3,3] auf das muster p (a:b:l) matcht. habe p[3,3] gleich auf das muster p(a:l) angewendet.
Er matcht aber trotzdem weil [3,3] nichts anderes ist wie e und drei und leere (rest)liste richtig?

danke für den hinweis.
Zum Seitenanfang    
 
Siracusa

Gepostet:
21.06.2010 19:24

   
> Er matcht aber trotzdem weil [3,3] nichts anderes ist wie e und drei und leere (rest)liste richtig?

Na das e ist aber aus nem anderen Fall, aber sonst stimmt's schon, [3,3] ist das gleiche wie 3:3:[].
Zum Seitenanfang    
 
constructor

Gepostet:
21.06.2010 19:37

   
> Na das e ist aber aus nem anderen Fall, aber sonst stimmt's schon, [3,3] ist das gleiche wie 3:3:[].

hehe ja hab mich nur verschrieben ;) thx
Zum Seitenanfang