www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Jojo

Gepostet:
28.11.2005 19:59

findandreplace  
Hallo,

also ich bin anfänger was haskell betrifft und habe nun bei zwei aufgaben, die ich in meinem studium lösen muss, probleme.

1. Ich soll eine Funktion findAndReplace schreiben (findAndReplace :: String->String->String->String), die sequentiell in einem Text jedes Vorkommen eines Strings str durch einen anderen String newstr ersetzt. Dabei wäre es am besten, wenn der Text nur einmal von rechts nach links durchgegangen wird (also wenn der neue String wieder den alten enthält, soll dieser nicht mehr ersetzt werden).

2. Diese Aufgabe finde ich noch schwieriger: Also gegeben ist folgende Funktion:
aufAb :: Int->Int
aufAb n
| n==1 = 1
| even n = aufAb (div n 2)
| odd n = aufAb (3*n+1)


Die Aufgabenstellung ist folgende: Schreiben Sie Funktionen, die für Argumente n aus einem Eingabeintervall die maximale Anzahl an Funktionsaufrufen aufAb () bei der Bestimmung von aufAb n berechnet, die maximalen Zwischenergebnisse bei der Berechnung von aufAb n ausgibt und Listen der lokalen Maxima bezüglich dieser beiden Kriterien erstellt (dieses letzte ist glaube ich überflüssig; wichtig sind die zwei ersten Funktionen).
(Also ich soll einmal eine Funktion schreiben, die als eingabe n kriegt und dann für das Intervall [1..n] die Funktionsaufrufe bei jeder Zahl aus dem Intervall berechnet, und mir dann eine Liste ausgibt: [(n1,x1),(n2,x2)...] wobei n eine Zahl aus dem Intervall bis n ist und x die Anzahl der Funktionsaufrufe beim zugehörigen n; die zweite Funktion gibt eine Liste aus [(n1,x1),(n2,x2)...] wobei hier x das maximale Zwischenergebnis bei der Berechnung von aufAb vom zugehörigen n ist. so zumindest habe ich die Aufgabenstellung verstanden)

Ich hoffe ihr habt die Aufgaben verstanden und könnt mir helfen!
Vielen dank schon mal!
Zum Seitenanfang    
 
Jacke

Gepostet:
28.11.2005 23:10

   
findAndReplace :: String->String->String->String
findAndReplace t s n =findAndReplace2 (t,s,n,[])

findAndReplace2 ([],[],[],acc)=acc
findAndReplace2 ([],s,[],acc)=acc
findAndReplace2 (t:ts,[],[],acc)=findAndReplace2(ts,[],[],acc++[t]) ---wenn noch text da ist
findAndReplace2 (t:ts,s:ss,[],acc) =findAndReplace2 (ts,ss,[],acc) --wenn das suchwort länger ist

findAndReplace2 (t:ts,[],(n:new),acc) = findAndReplace2(t:ts,[],new,acc++[n])--wenn das ersetzende wort länger ist
findAndReplace2 ([],(s:str),(n:new),acc) = acc
findAndReplace2 ((t:text),(s:str),(n:new),acc)
|(t==s)&&find(text,str) =findAndReplace2(text,str,new, acc++[n])
|otherwise = findAndReplace2(text,s:str,n:new,acc++[t])
where
find (x,[]) =True
find(ts:tss,s:ss)
|(ts==s) =find (tss,ss)
|otherwise =False


meintext="hallo welt!"

suchstr="welt"
newstr="jojojo"


so das funktioniert schonmal...
Aufruf
Main> findAndReplace meintext suchstr newstr
"hallo jojojo!"
Main>
Zum Seitenanfang    
 
Jojo

Gepostet:
29.11.2005 11:37

danke, aber...  
Vielen, vielen dank schon mal für deinen einsatz. leider ist die fuktion nicht ganz so, wie sie sein sollte:

Main> findAndReplace "halle mein Name ist Julia und Johanna" "ha" "lo"
"lolle mein Name ist Julia und Johanna"


da hätte die funktion eigentlich auch das "ha" in "Johanna" ersetzen müssen!
falls du das zufällig beheben könntest (oder weißt wie die funktion zu ergänzen ist) wäre ich dir noch dankbarer!

noch eine andere Frage: was bedeutet das acc? ist das eine variable?

und noch eine andere frage:

findAndReplace2 ((t:text),(s:str),(n:new),acc)
|(t==s)&&find(text,str) =findAndReplace2(text,str,new, acc++[n])
|otherwise = findAndReplace2(text,s:str,n:new,acc++[t])


warum schreibst du str und new (unterstrichen) und nicht (s:str) und (n:new)

Danke, danke, danke! Vielleicht hast du ja lust dir das nochmal anzugucken (und hast du ne Idee für aufgabe 2?)!
Zum Seitenanfang    
 
Jacke

Gepostet:
29.11.2005 16:33

   
findAndReplace2 ((t:text),(s:str),(n:new),acc)
|(t==s)&&find(text,str) =findAndReplace2(text,str,new, acc++[n])
|otherwise = findAndReplace2(text,s:str,n:new,acc++[t])

warum schreibst du str und new (unterstrichen) und nicht (s:str) und (n:new)


weil ich denn ersten buchstaben vom suchstring da schon ersetzt habe...das brauch ich für die anker funktionen damit die rekursion irgendwann abbrechen kann...
die zweite aufgabe ist nicht besonders schwierig du mußt dir nen akkumulator machen...so einen wie in findandreplace2 und darauf immer +1 addieren...für jeden rekursionsschritt...und die zwischenergebnisse haust du alle in ne liste rein, die führst du als 2ten akkumulator mit...so jetzt programmier ich noch schnell das es alle strings ersetzt
Zum Seitenanfang    
 
Jacke

Gepostet:
29.11.2005 16:48

   

f ([],s,n) = []
f (t:ts,s,n) = findAndReplace ([t]++f(ts,s,n)) s n

findAndReplace :: String->String->String->String
findAndReplace t s n =findAndReplace2 (t,s,n,[])

findAndReplace2 ([],[],[],acc)=acc
findAndReplace2 ([],s,[],acc)=acc
findAndReplace2 (t:ts,[],[],acc)=findAndReplace2(ts,[],[],acc++[t]) ---wenn noch text da ist
findAndReplace2 (t:ts,s:ss,[],acc) =findAndReplace2 (ts,ss,[],acc) --wenn das suchwort länger ist

findAndReplace2 (t:ts,[],(n:new),acc) = findAndReplace2(t:ts,[],new,acc++[n])--wenn das ersetzende wort länger ist
findAndReplace2 ([],(s:str),(n:new),acc) = acc
findAndReplace2 ((t:text),(s:str),(n:new),acc)
|(t==s)&&find(text,str) =findAndReplace2(text,str,new, acc++[n])
|otherwise = findAndReplace2(text,s:str,n:new,acc++[t])
where
find (x,[]) =True
find(ts:tss,s:ss)
|(ts==s) =find (tss,ss)
|otherwise =False



meintext="hallo welt, welt welt welt!"

suchstr="welt"
newstr="jojojo"


so funktion f ersetzt alle ...;-) ich kann die funktion auch noch umbennenen...aber ich denke das kriegste auch noch hin

aufruf

Main> f(meintext,suchstr,newstr)
"hallo jojojo, jojojo jojojo jojojo!"
Main>


gruß jacke

Zum Seitenanfang