www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

franzigoth1

Gepostet:
01.12.2007 12:37

Cantor...  
Hallo,
ich weiß wie man Cantor in Haskell impementiert:

cant:: (Int,Int)->Int
cant(0,0)=0
cant(0,a)=cant(a - 1, 0) + 1
cant(b,a)=cant(b-1, a+1) +1

--Standard-Testfall cpn (2,3) == 17

Aber wie kann man das Umformen, so das der
Standard-Testfall cpi 17 == (2,3) rauskommt. cpi ist quasi die Umkehrfunktion von cant.

cpi::Int->(Int,Int)

Hat einer eine Idee

Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
01.12.2007 22:05

   
Bei dieser Aufgabe hilft es, sich mit der Funktion cpn mal eine Tabelle aufzuschreiben, wobei die Zeilen den ersten Wert der Klammer und die Spalten den zweiten Wert der Klammer erhalten. Dann füllst du die Tabelle mit den Funktionswerten von cpn (zeile, spalte) aus und schaust, wie man von einer Zahl n zu seinem Vorgänger gelangt. So kannst du dir die Funktion cpi konstruieren, indem die Position der Zahl n immer durch eine kleine Veränderung der Position der Zahl n-1 ermittelt wird, wobei die Position von 0 = (0,0) ist. Also als Codefragment etwa so:

cpi 0 = (0,0)
cpi n = (zeile', spalte')
where
(zeile', spalte') = berechneVorgaengerPosition (zeile, spalte)
(zeile, spalte) = cpi (n-1)

berechneVorgaengerPosition (zeile, spalte) = ...


Oder einfach alle Positionen (x,y) durchprobieren, bis die richtige gefunden ist, für die cpn (x,y) = n gilt. Das ist allerdings ziemlich ineffizient und könnte bei großen Zahlen schnell extrem langsam werden.

Ich hoffe das war soweit alles verständlich. Bei weiteren Fragen - einfach fragen. :-)


Viele Grüße,

Siracusa
Zum Seitenanfang