Programowanie funkcyjne/Model obliczeń/Ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Kubica (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
==Ćwiczenia==
== 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?
*Potęgowanie liczb - liniowe i logarytmiczne, ogonowe.  
* 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 [13;23;;n3]. 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 [a1;a2;;an] zawierającej permutację zbioru {1,2,,n} znajdzie jej podział na jak najliczniejszą listę list postaci:
[[a1;a2;;ak1];[ak1+1;ak1+2;;ak2];;[akm1+1;akm1+2;;akm]],


taką, że:
{a1,a2,,ak1}={1,2,,k1}(równość zbiorów),{ak1+1,ak1+2,,ak2}={k1+1,k1+2,,k2},{akm1+1,akm1+2,,akm}={km1+1,km1+2,,km}


Przyjmujemy, że wynikiem dla listy pustej jest lista pusta.
Przykład: podziel[2;3;1;6;5;4;7;9;10;11;8]=[[2;3;1];[6;5;4];[7];[9;10;11;8]].
Rozwiązując to zadanie powinieneś skorzystać z rekurencji, ale wolno Ci korzystać wyłącznie z rekurencji ogonowej.