www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

BuZZo

Gepostet:
16.04.2010 17:28

Problem mit Funktionen  
Hallo,

bin Informatikstudent und wir haben diese Woche mit Haskell angefangen, hab also noch reichlich wenig Ahnung ;)


Wir haben die Aufgabe, die built-in funktionen mod und div (im folgenden genannt "rest" und "teiler") selbst zu implementieren, wobei nur +, - und Vergleichsoperationen benutzt werden dürfen. Das hat auch soweit alles geklappt.
Nun sollen wir aber mit Hilfe unserer beiden selbst geschriebenen Funktionen die Quersumme einer Zahl zu berechnen. Funktionieren tut das ganze trotz richtig aussehenden Quellcodes aber leider nicht, es gibt einen Stack Overflow:

teiler a m = if (a-m) < m
then 1
else 1 + teiler (a-m) m

rest a m = if (a-m) < m
then (a-m)
else rest (a-m) m

quersumme x = if (teiler x 10) == 0
then (rest x 10)
else (rest x 10) + (quersumme (teiler x 10))


Komischerweise geht es, wenn ich in der quersumme-Funktion statt meiner eigenen Funktionen rest und teiler die built-ins div und mod benutze.
Irgendeine Ahnung, woran das liegt?

Danke!

Zum Seitenanfang    
 
CryPtor

Gepostet:
16.04.2010 18:06

   
Hallo BuZZo.

Das Problem bei deinen Funktionen ist, dass du bei der Funktion

teiler a m = if (a-m) < m then 1


sagst, wenn '(a-m) < m' soll er die 1 nehmen, aber z. B. bei teiler 6 10 (was ja diesem Fall entspricht) würde er nach deiner Funktion '1' ausgeben. Es müsste aber '0' sein.
Also musst du noch den Fall abfangen, dass (a-m) < 0 sein kann.

Das gleiche gilt für die Funktion Rest.
Bei Rest 6 10 gibt deine Funktion -4 aus, was ja falsch ist. Es müsste ja 6 sein.

teiler a m
|(a-m) < m = if (a-m) < 0 then 0 else 1
|otherwise = 1 + teiler (a-m) m

rest a m
|(a-m) < m = if (a-m) < 0 then a else (a-m)
|otherwise = rest (a-m) m

quersumme x
|(teiler x 10) == 0 = (rest x 10)
|otherwise = (rest x 10) + (quersumme (teiler x 10))



Hoffe, dass hat dir geholfen.
Zum Seitenanfang    
 
BuZZo

Gepostet:
16.04.2010 18:52

   
aaah danke, das sieht schon besser aus :)

dass er große zahlen wie 123456789 nicht handlen kann, ist aber normal, oder?
Zum Seitenanfang    
 
CryPtor

Gepostet:
16.04.2010 23:13

   
Ja ist normal. Du machst halt bei großen Zahlen sehr viele Rekursionschritte.
Wenn du das verhindern willst, müsstest du die Funktionen endrekursiv schreiben.
Zum Seitenanfang