Programowanie funkcyjne/Wyliczanie procesów/Ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przemek (dyskusja | edycje)
mNie podano opisu zmian
Przemek (dyskusja | edycje)
Linia 12: Linia 12:


==Laboratorium==
==Laboratorium==
* Napisz procedurę <tt>sześciany:&nbsp;int <math> \to</math> int list</tt> taką, że wynikiem <tt>sześciany <math> n</math></tt> jest lista postaci<math> [1^3; 2^3; \dots; n^3]</math>. Rozwiązując to zadanie:
* Napisz procedurę <tt>sześciany:&nbsp;int <math> \to</math> int list</tt> taką, że wynikiem <tt>sześciany</tt> <math> n</math> 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,
**jedyne operacje na liczbach, z jakich możesz korzystać to: <tt>+</tt>, <tt>-</tt> oraz porównywanie.  
**jedyne operacje na liczbach, z jakich możesz korzystać to: <tt>+</tt>, <tt>-</tt> oraz porównywanie.  

Wersja z 09:10, 27 lip 2006

Ćwiczenia

  • Porównaj foldr i foldl. Która z nich jest ogonowa?
  • Potęgowanie liczb - liniowe i logarytmiczne, ogonowe.
  • 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ą. Rozrysować 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 znajdziejej 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(rownosc zbiorow),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.