www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Icegirl

Gepostet:
10.09.2005 11:42

Endrekursiv  
hey, ich bin's mal wieder ;)

also ich sollte halt mehrere Funktionen schreiben, aber weiß nicht wie man so wirklich endrekursiv macht?!
z.b. ich habe "summeVonBis"
dann hab ich erstmal so programmiert und soll mir danach überlegen mit endrekursiv (?):
summeVonBis a b
|a==b = b
|otherwise = a + summeVonBis (a+1) b

wäre schön, wenn du mir es kurz erklären könntest wie ich solche funktionen endrekursiv machen kann?

danke schön fürs lesen und helfen Smilie
wünsch dir noch ein schönes wochenende
Zum Seitenanfang    
 
Icegirl

Gepostet:
10.09.2005 11:59

   
ich hab gerade mal versucht für summeVonBis endrekursiv zu schreiben, aber irgendein fehler ist noch drin oder alles falsch...


vonbis a b = vonbis1 a b
vonbis1 0 0 akku = akku
vonbis1 a b akku
|a==b = vonbis1 (akku+b)
|otherwise = vonbis1 a b (akku:a) b



Smilie
Zum Seitenanfang    
 
Jacke

Gepostet:
11.09.2005 20:02

   
also ich verrat dir erstmal wofür endrekursion gut ist...;-)
man braucht endrekursion weil rekursive funktionen platz auf dem stack benötigen...deshalb wandelt man rekursive funktionen in endrekursive um...

also mußt du dir das ganze nur wie ne while schleife vorstellen
summevonbis a b=  vonbis1 a b 0 where
vonbis1 a b acc = if a==b then acc
else vonbis1 (a+1) b (acc+a)

oder so

summevonbis a b= vonbis1 a b 0 where
vonbis1 a b acc
|a==b = acc
|otherwise = vonbis1 (a+1) b (acc+a)


in der ersten zeile rufst du immer deine hilfsfunktion auf ...mit dem acc auf 0 ...(oder eben mit acc auf 1 wenn du multiplizierst)
und dann kommt die richtige funktion..

bin mir nicht ganz sicher ob das geht...;-) probiers mal aus...er wirft zumindest keinen fehler...

gruß jacke

Zum Seitenanfang    
 
Icegirl

Gepostet:
11.09.2005 22:25

   
danke, echt sorry, wenn ich damit nerve

ok muss ich morgen nochmal versuchen mit den anderen aufgaben. aber eigentlich müsste doch summeVonBis das gleiche rauskommen wie beim endrekursiven oder?
z.b. ich rufe summeVonBis 4 8 auf kriege 30 raus
und mitm endrekursiven Darstellung 4 8 kriege ich 22 raus
so kann es doch nicht richtig sein oder?
und noch ne frage halt, ob ich das richtig verstanden habe mit endrekursiv schreiben:
nmal a 0 = []
nmal a n = nmal1 a n 0
nmal1 a n acc = nmal1 (a+acc)(n-1)(n-acc)
so etwa?
Smilie
Zum Seitenanfang    
 
Jacke

Gepostet:
12.09.2005 13:09

   
summevonbis a b=  vonbis1 a b 0 where
vonbis1 a b acc
|a==b = (acc+a)
|otherwise = vonbis1 (a+1) b (acc+a)

nein das geht so nicht wie du das schreibst...du mußt in der hauptfunktion die unterfunktion das erste mal aufrufen so wie bei mir in der ersten zeile...;-)
hab vergessen die letzte zahl dazuzuaddieren...Smilie

nmal a n = nmal1 a n [] where
| n==0 = acc
|otherwise = nmal1 a (n-1) (a:acc)

so müßte das gehen...
Zum Seitenanfang