Programowanie funkcyjne/Model obliczeń/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 1: | Linia 1: | ||
== | == Praca domowa == | ||
*Porównaj <tt>foldr</tt> i <tt>foldl</tt>. Która z nich jest ogonowa? | * Porównaj <tt>foldr</tt> i <tt>foldl</tt>. Która z nich jest ogonowa? | ||
* | * Zaimplementuj potęgowanie liczb -- ogonowo, raz o złożoności liniowej, a raz o złożoności logarytmicznej. | ||
*Rozważ standardowe procedury przetwarzania list: <tt>length</tt>, <tt>map</tt>, <tt>append</tt>,<tt>rev</tt>. Czy w ich przypadku definicja ogonowa zmniejsza złożoność pamięciową? | |||
*Potęgowanie funkcji - najpierw liniowe, potem logarytmiczne, ale obie wersje z rekurencją ogonową. Rozrysuj w jaki sposób oblicza się: | == Ćwiczenia == | ||
* Rozważ standardowe procedury przetwarzania list: <tt>length</tt>, <tt>map</tt>, <tt>append</tt>,<tt>rev</tt>. Czy w ich przypadku definicja ogonowa zmniejsza złożoność pamięciową? | |||
* Potęgowanie funkcji -- najpierw liniowe, potem logarytmiczne, ale obie wersje z rekurencją ogonową. Rozrysuj w jaki sposób oblicza się: | |||
iterate 2 ('''function''' x -> x * (x+1)) 2 | iterate 2 ('''function''' x -> x * (x+1)) 2 | ||
iterate 3 ('''function''' x -> x * (x+1)) 1 | iterate 3 ('''function''' x -> x * (x+1)) 1 | ||
(w zależności od wersji, cierpliwości i powierzchni tablic :-). W przypadku wersji logarytmicznej, procedura wynikowa jest | (w zależności od wersji, cierpliwości i powierzchni tablic :-). | ||
W przypadku wersji logarytmicznej, procedura wynikowa jest | |||
obliczana w czasie logarytmicznym, ale ona sama działa w czasie liniowym. | obliczana w czasie logarytmicznym, ale ona sama działa w czasie liniowym. | ||
==Laboratorium== | == Laboratorium == | ||
* Napisz procedurę <tt>sześciany : int -> int list</tt> taką, że wynikiem <tt>sześciany n</tt> jest lista postaci <math> [1^3; 2^3; \dots; n^3]</math>. Rozwiązując to zadanie: | * Napisz procedurę <tt>sześciany : int -> int list</tt> taką, że wynikiem <tt>sześciany n</tt> jest lista postaci <math> [1^3; 2^3; \dots; n^3]</math>. Rozwiązując to zadanie: | ||
** możesz korzystać wyłącznie z rekurencji ogonowej, | ** możesz korzystać wyłącznie z rekurencji ogonowej, |
Wersja z 23:15, 8 lis 2006
Praca domowa
- Porównaj foldr i foldl. Która z nich jest ogonowa?
- Zaimplementuj potęgowanie liczb -- ogonowo, raz o złożoności liniowej, a raz o złożoności logarytmicznej.
Ćwiczenia
- Rozważ standardowe procedury przetwarzania list: length, map, append,rev. Czy w ich przypadku definicja ogonowa zmniejsza złożoność pamięciową?
- Potęgowanie funkcji -- najpierw liniowe, potem logarytmiczne, ale obie wersje z rekurencją ogonową. Rozrysuj w jaki sposób oblicza się:
iterate 2 (function x -> x * (x+1)) 2 iterate 3 (function x -> x * (x+1)) 1
(w zależności od wersji, cierpliwości i powierzchni tablic :-). W przypadku wersji logarytmicznej, procedura wynikowa jest obliczana w czasie logarytmicznym, ale ona sama działa w czasie liniowym.
Laboratorium
- Napisz procedurę sześciany : int -> int list taką, że wynikiem sześciany n jest lista postaci . Rozwiązując to zadanie:
- możesz korzystać wyłącznie z rekurencji ogonowej,
- jedyne operacje na liczbach, z jakich możesz korzystać to: +, - oraz porównywanie.
- Napisz procedurę podziel : int list -> int list list, która dla danej listy zawierającej permutację zbioru znajdzie jej podział na jak najliczniejszą listę list postaci:
- taką, że:
- Przyjmujemy, że wynikiem dla listy pustej jest lista pusta.
- Przykład: .
- Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej.