Programowanie funkcyjne/Podstawy/Ćwiczenia: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przemek (dyskusja | edycje)
Nie podano opisu zmian
Kubica (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
==Ćwiczenia==
==Praca domowa==
 
* Forma specjalna <tt>let-in</tt> jest tylko lukrem syntaktycznym i może być rozwinięta do <math>\lambda </math>-abstrakcji. W jaki sposób?
* Stopień parzystości liczby całkowitej <math>x</math>, to największa taka liczba naturalna <math> i</math>, że <math>x</math> dzieli się przez 2<sup>i</sup>. Liczby nieparzyste mają stopień parzystości 0, liczby 2 i -6 mają stopień parzystości 1, a liczby 4 i 12 mają stopień parzystości 2. Przyjmujemy, że 0 ma stopień parzystości -1.  
* Udowodnij, że dla każdego naturalnego <math>n</math> zachodzi <math> \texttt{fib}\ n = \mbox{Fib}_n</math>. Podaj specyfikację dla <tt>fibpom</tt> i udowodnij ją przez indukcję.  
Napisz procedurę <tt>parzystość</tt> wyznaczającą stopień parzystości danej liczby całkowitej.
 
* Udowodnij, że dla każdego naturalnego <tt>n</tt>, <tt>fib n</tt> jest równe <tt>n</tt>-tej liczbie Fibonacciego. Podaj specyfikację dla <tt>fibpom</tt> i udowodnij ją przez indukcję.  


  '''let''' fib n =
  '''let''' fib n =
Linia 10: Linia 12:
  &nbsp;&nbsp;&nbsp;&nbsp;fibpom 0 1 n;;
  &nbsp;&nbsp;&nbsp;&nbsp;fibpom 0 1 n;;


==Laboratorium==
* Forma specjalna <tt>let-in</tt> jest tylko lukrem syntaktycznym i może być rozwinięta do <math>\lambda </math>-abstrakcji. W jaki sposób?
Uruchamianie Ocamla. Proste programiki operujące liczbami całkowitymi (bez rekurencji ogonowej i list):


* Stopień parzystości liczby całkowitej <math> x</math>, to największa taka liczba naturalna <math> i</math>, że <math>x</math> dzieli się przez 2<sup>i</sup>. Liczby nieparzyste mają stopień parzystości 0, liczby 2 i -6 mają stopień parzystości 1, a liczby 4 i 12 mają stopień parzystości 2. Przyjmujemy, że 0 ma stopień parzystości -1.
==Ćwiczenia==
 
W przypadku zajęć laboratoryjnych należy najpierw zapoznać studentów ze środowiskiem i uruchamianiem Ocamla.  
Napisz procedurę <tt>parzystość</tt> wyznaczającą stopień parzystości danej liczby całkowitej.


* sprawdź, czy liczba jest pierwsza,
Rozwiązaniami poniższych zadań są proste programiki operujące na liczbach całkowitych
* sprawdzenie podzielności przez 9 metodą sumowania cyfr: liczba -> suma cyfr, powtarzać aż do uzyskania liczby jednocyfrowej,
(bez rekurencji ogonowej i list):
* odwrócić liczbę (<math> 1234 \to 4321</math>),
* Napisz procedurę, która sprawdza czy dana liczba jest pierwsza,
* sprawdzenie, czy liczba dzieli się przez 11: sumujemy cyfry liczby znajdujące się na parzystych pozycjach, oraz te na nieparzystych pozycjach, różnica tych dwóch reszt przystaje modulo 11 do wyjściowej liczby; powtarzać aż do uzyskania liczby jednocyfrowej,
* Napisz procedurę, która sprawdza czy dana liczba jest podzielna przez 9 w następujący sposób: jedyne liczby jednocyforwe podzielne przez 9 to 9 i 0; reszta z dzielenia liczby wielocyforwej przez 9 jest taka sama, jak reszta dzielenia sumy jej cyfr przez 9; jeśli suma cyfr jest wielocyfrowa, to całość powtarzamy. aż do uzyskania liczby jednocyfrowej.
* kodowanie par liczb całkowitych jako liczby całkowite.
* Napisz procedurę, która przekształca daną liczbę w taką, w której cyfry wystepują w odwrotnej kolejności, np. 1234 jest przekształcane na 4321.
* Napisz procedurę, która sprawdza czy dana liczba jest podzielna przez 11 w następujący sposób: sumujemy cyfry liczby znajdujące się na parzystych pozycjach, oraz te na nieparzystych pozycjach, różnica tych dwóch liczb przystaje modulo 11 do wyjściowej liczby; krok ten należy powtarzać aż do uzyskania liczby jednocyfrowej.
* Zaimplementuj kodowanie par liczb całkowitych jako liczby całkowite. To znaczy, napisz procedurę dwuargumentową, która koduje dwie liczby dane jako argumenty w jednej liczbie całkowitej. Dodatkowo napisz dwie procedury, które wydobywają z zakodowanej pary odpowiednio pierwszą i drugą liczbę.

Wersja z 11:50, 22 sie 2006

Praca domowa

  • Stopień parzystości liczby całkowitej x, to największa taka liczba naturalna i, że x dzieli się przez 2i. Liczby nieparzyste mają stopień parzystości 0, liczby 2 i -6 mają stopień parzystości 1, a liczby 4 i 12 mają stopień parzystości 2. Przyjmujemy, że 0 ma stopień parzystości -1.

Napisz procedurę parzystość wyznaczającą stopień parzystości danej liczby całkowitej.

  • Udowodnij, że dla każdego naturalnego n, fib n jest równe n-tej liczbie Fibonacciego. Podaj specyfikację dla fibpom i udowodnij ją przez indukcję.
let fib n =
  let rec fibpom a b n = 
    if n = 0 then a else fibpom b (a + b) (n - 1)
  in 
    fibpom 0 1 n;;
  • Forma specjalna let-in jest tylko lukrem syntaktycznym i może być rozwinięta do λ-abstrakcji. W jaki sposób?

Ćwiczenia

W przypadku zajęć laboratoryjnych należy najpierw zapoznać studentów ze środowiskiem i uruchamianiem Ocamla.

Rozwiązaniami poniższych zadań są proste programiki operujące na liczbach całkowitych (bez rekurencji ogonowej i list):

  • Napisz procedurę, która sprawdza czy dana liczba jest pierwsza,
  • Napisz procedurę, która sprawdza czy dana liczba jest podzielna przez 9 w następujący sposób: jedyne liczby jednocyforwe podzielne przez 9 to 9 i 0; reszta z dzielenia liczby wielocyforwej przez 9 jest taka sama, jak reszta dzielenia sumy jej cyfr przez 9; jeśli suma cyfr jest wielocyfrowa, to całość powtarzamy. aż do uzyskania liczby jednocyfrowej.
  • Napisz procedurę, która przekształca daną liczbę w taką, w której cyfry wystepują w odwrotnej kolejności, np. 1234 jest przekształcane na 4321.
  • Napisz procedurę, która sprawdza czy dana liczba jest podzielna przez 11 w następujący sposób: sumujemy cyfry liczby znajdujące się na parzystych pozycjach, oraz te na nieparzystych pozycjach, różnica tych dwóch liczb przystaje modulo 11 do wyjściowej liczby; krok ten należy powtarzać aż do uzyskania liczby jednocyfrowej.
  • Zaimplementuj kodowanie par liczb całkowitych jako liczby całkowite. To znaczy, napisz procedurę dwuargumentową, która koduje dwie liczby dane jako argumenty w jednej liczbie całkowitej. Dodatkowo napisz dwie procedury, które wydobywają z zakodowanej pary odpowiednio pierwszą i drugą liczbę.