www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

paco89

Gepostet:
01.03.2012 21:27

Haskell Programmcode  
hallo, ich musste folgende aufgabe versucht zu lösen:

Aufgabe 1: In dieser Aufgabe beschäftigen wir uns mit Kindermobiles, die man beispielsweise über das bett hängen kann. Ein Kindermobile besteht aus mehreren Figuren die mit fäden aneinander aufgehängt sind. wir beschränken uns auf die Figuren Sterne, Seepferdchen, elefanten und Kängurus.
An sternen und seepferdchen hängen keine weiteren figuren, an elefanten nur eine, und an kängurus hängen 2 weitere figuren. außerdem haben Kängurus einen beutel, was man füllen kann.

in der teilaufgabe a) sollten wir eine neue datenstruktur mit data definieren. das konnte ich :


data Mobile a = Stern | Seepferdchen | Elefanten (Mobile a) | Kaenguru a (Mobile a ) (Mobile a ) deriving Show



so in der nächsten teilaufgabe mussten wir eine funktion schreiben, die alle figuren in einem kindermobile zählt. also hab ich die folgende funktion geschrieben:

count :: Mobile a -> Int

count Seepferdchen = 1
count Stern = 1
count (Elefant a) = 1 + count a
count (Kaenguru inhalt b c )= 1 + count b + count c




so und dann mussten wir folgende aufgabe lösen:

c) schreiben sie eine funktion greife:: Mobile a -> Int -> Mobile a. die funktion soll für den aufruf greife mobile n die figur mit dem index n im Mobile mobile zurückgeben.
wenn man sich das ganze als baumstruktur vorstellt so werden die indizes entsprechend einer tiefensuche berechnet. wir definieren dass die oberste figur den index 1 hat. wenn ein elefant den index n hat, so hat die nachfolgefigur den index n+1.
wenn ein känguru den index n , so hat die linke nachfolgefigur den index n+1. haben alle figuren im linken teil-mobile einen index, so hat die rechte nachfolgefigur den nächsthöheren index.


ich konnte die aufgabe nicht lösen. und hab in die musterlösung geschaut, dort stand folgender code:


greife :: Mobile a -> Int -> Mobile a
greife x 1 = x
greife (Elefant a ) x = greife a (x-1)
greife (Kaenguru inhalt a b) x | (x-1) <= count a = greife a (x-1)
| otherwise = greife b (x-1- (count a))

greife´ :: Mobile a -> Int -> Mobile a
greife´ x 1 = x
greife´ (Elefant a ) x = greife´ a (x-1)
greife´ (Kaenguru inhalt a b) x = let xDec = x-1
countA = count a
in if xDec <= countA
then greife´ a xDec
else greife´ b (xDec - countA)






als hinweis war gegeben, dass man die funktion count benutzen sollte.

ich versteh den code greife nicht. wäre nett, wenn ihn mir jmd. erklären würde. jede hilfe ist willkommen.



lg

Zum Seitenanfang    
 
Landei

Gepostet:
04.03.2012 13:45

   
greife ist wesentlich klarer als greife\'. Der erste Fall sagt: Wenn du den index 1 hast und gerade bei Figur x bist, gib diese Figur zurück. Klingt logisch. Der zweite Fall sagt, dass wenn du bei einem Elefanten bist, dass du eine Ebene tiefer weitersuchen sollst, wobei der Index um eins vermindert wird (weil ja der Elefant auch einen Index hat). Kompliziert ist eigentlich nur das Känguru, denn da muss man wissen, ob man in den ersten oder in den zweiten Unterbaum gehen muss. Also zählen wir erst einmal die Elemente im ersten Unterbaum mit count. Dann schauen wir, ob der Index minus 1 kleiner als diese Anzahl ist, dann müssen wir dort weitersuchen (wie beim Elefanten kommt das minus 1 dadurch zustande, dass das Känguruh selbst auch einen Index braucht). Ist der Index größer, müssen wir im zweiten Unterbaum weitersuchen, und berücksichtigen, dass count a Indexe ja schon für den ersten Baum vergeben wurden.

Zeichne dir einfach mal ein etwas komplizierteres Mobile auf, ermittele, welche Indizes nach den gegebenen Regeln da dran müssen, und dann führe greife einmal \"per Hand\" aus. Dann verstehst du die Arbeitsweise recht schnell.
Zum Seitenanfang