Jak się implementuje spamiętywanie w Haskellu?

Jak się implementuje spamiętywanie w Haskellu?
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
0

Przymuszony na studiach zdołałem napisać w Haskellu interpreter wymyślonego przez siebie języka programowania, nawet z konieczności transformaturów monad używałem, choć oczywiście ani trochę nie czuję, bym rozumiał, co robiłem.

Niewątpliwie programowanie funkcyjne to zaległość, którą trzeba będzie nadrobić, ale na poważnie się za to wezmę kiedy indziej...

Na razie jedno proste pytanie: Jak zaimplementować w Haskellu coś tak prostego, jak Fibonacci lub 3n+1? Myślałem nad tym i naprawdę nie mam pojęcia.

Te problemy wymagają spamiętywania, by ich złożoność nie rosła do absurdalnych wielkości. Jak takie coś się implementuje w Haskellu?

Widzę dwie możliwości: (a) funkcja licząca fibonacciego zawsze oczekuje jako argumentu i zwraca nie tylko wynik, ale i obecną tablicę z cache. Ale taki pattern to jest dokładnie to, co - o ile rozumiem - mają abstrahować monady. A więc (b) monada State - ale to wydaje się być jakiś overkill.

lion137
Popraw tytuł wątku.
KM
Nie widzę, co jest złego w tym tytule?
Gustlik44
  • Rejestracja:około 5 lat
  • Ostatnio:4 miesiące
  • Postów:11
0

Nie piszę w Haskhellu, ale wydaje mi się, że musiałbyś wykorzystać rekurencję ogonową.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:5 minut
  • Postów:4934
1

Jest wiki:
https://wiki.haskell.org/The_Fibonacci_sequence
A dokładniej, taki pseudokod do zimplementowania:

Kopiuj
def fibo_iterative(a, b, cnt):
    if cnt == 0:
        return b
    else:
        return fibo_iterative(a + b, a, cnt - 1)

Wibowit
To nie jest spamiętywanie tylko rekurencja ogonowa.
lion137
Tak, powinienem był to zaznaczyć. Dałem dlatego, że nie chciał monad.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
0
lion137 napisał(a):

Jest wiki:
https://wiki.haskell.org/The_Fibonacci_sequence
A dokładniej, taki pseudokod do zimplementowania:

Kopiuj
def fibo_iterative(a, b, cnt):
    if cnt == 0:
        return b
    else:
        return fibo_iterative(a + b, a, cnt - 1)

Tam gdzie nie da się zamienić rekurencji-rekurencji (złej) na rekurencji-iterację (dobrą) można jeszcze użyć Memoize


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
0
lion137 napisał(a):

Jest wiki:
https://wiki.haskell.org/The_Fibonacci_sequence
A dokładniej, taki pseudokod do zimplementowania:

Kopiuj
def fibo_iterative(a, b, cnt):
    if cnt == 0:
        return b
    else:
        return fibo_iterative(a + b, a, cnt - 1)

A teraz wyobraźmy sobie, że wołam fibo_iterative dla kolejnych liczb naturalnych bo chcę mieć tablicę wartości.

Albo muszę szybko odpowiadać online na zapytania o wartości liczb Fibonaciego dla dowolnych argumentów.

Nadal jestem w ciemnej dupie.

Dlatego świadomie pytałem o spamiętywanie, a nie o rekurencję ogonową.

Rekurencja ogonowa jest OK ale jeśli się nie mylę nie może w pełni zastąpić spamiętywania

Gustlik44
  • Rejestracja:około 5 lat
  • Ostatnio:4 miesiące
  • Postów:11
1

Jak chcesz mieć tablicę wartości to możesz ją przekazać jako akumulator w rekurencji ogonowej.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:5 minut
  • Postów:4934
0

Albo muszę szybko odpowiadać online na zapytania o wartości liczb Fibonaciego dla dowolnych argumentów.

Popatrz w tym wiki, najszybsze fibo jest logarytmiczne.


hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:14 dni
1

"Haskell memoization" - pierwszy wynik z DDG. Dodatkowo wydaje mi się, że GHC czasem to robi "automagicznie" jeśli "zauważy", że może.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.