Ich habe etwas Haskell gelernt und mache Euler-Probleme, während ich gehe. Ich bin nicht wirklich beunruhigt über die Antwort auf das Euler-Problem (das ich gerne brute, oder in einer anderen Sprache), sondern die Methode.Memoization & Project Euler Problem 15 in Haskell
Ich bin auf Problem 15 in angemessener Zeit stecken. Es fragt nach der Anzahl der nicht zurückverfolgenden Routen von oben links nach unten rechts eines 20x20-Gitters. Link here
Ich würde sagen, es ist ziemlich offensichtlich, dass die Idee ist, die Funktion zu memoize (sp?), Aber ich bin nicht ganz sicher, wie es geht. Ich googeln, und kam über this auf Haskell Cafe, dass ich naiv anzupassen versucht, aber am Ende mit:
memRoute :: (Int,Int) -> Int
memRoute (x,y) = fromJust $ lookup (x,y) $ map (\t -> (t,route t)) [(x,y) | x <- [0..20], y <- [0..20]]
route (0,0) = 0
route (_,0) = 1
route (0,_) = 1
route (x,y) = memRoute (x-1,y) + memRoute (x,y-1)
Welche sieht schlecht aus und führt schrecklich (viel langsamer als eine naive Version). Das Problem ist, dass ich nicht wirklich verstehe, wie Haskell Memoization funktioniert.
Mit meinem Code als Beispiel, würde jemand dafür interessieren a) zu erklären, warum mein so langsam
b) ist, wie es (ohne mutables getan werden soll, was eine Lösung war ich über kam)
c) wie Die Memoisierung funktioniert in diesem Fall?
Ich habe Ihr Programm noch nicht gelesen, aber ich wollte Sie wissen lassen, dass es eine clevere O (1) -Lösung gibt. Siehe http://www.haskell.org/haskellwiki/Euler_problems/11_to_20#Problem_15 –
Allgemeiner ist dies ein Problem der enumerativen Kombinatorik. Die beabsichtigte Lösung ist eigentlich keine konstante Zeit - Arithmetik ist nicht frei, besonders wenn es sich um Faktoren handelt - aber es ist sicherlich weitaus effizienter als tatsächlich jede Route zu durchlaufen. –
Dieses Problem ist schrecklich ... Ich erinnere mich noch daran ... und die Versuche, es brutal zu erzwingen. Ehrlich gesagt, wer kann wohl über Pascals Dreieck nachdenken, wenn er sich dieses Problem anschaut :) – Jerome