Gepostet: |
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 | |||||||||||
Gepostet: |
|||||||||||
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 Hoffe, dass hat dir geholfen. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
aaah danke, das sieht schon besser aus :) dass er große zahlen wie 123456789 nicht handlen kann, ist aber normal, oder? |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||