Programowanie funkcyjne/Podstawy/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
|||
Linia 12: | Linia 12: | ||
* 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? | * 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? | ||
==Ćwiczenia== | ==Ćwiczenia== | ||
Linia 18: | Linia 19: | ||
Rozwiązaniami poniższych zadań są proste programiki operujące na liczbach całkowitych | Rozwiązaniami poniższych zadań są proste programiki operujące na liczbach całkowitych | ||
(bez rekurencji ogonowej i list): | (bez rekurencji ogonowej i list): | ||
* | |||
* Napisz procedurę, która sprawdza, czy dana liczba jest | * Sumy kolejnych liczb nieparzystych dają kwadraty kolejnych liczb naturalnych, zgodnie ze wzorem: <math>\sum_{i=1}^k (2 i - 1) = k^2</math>. Wykorzystaj ten fakt do napisania procedury <tt>sqrt</tt> obliczającej <tt>sqrt x</tt> <math> = \floor{\sqrt{x}}</math>. | ||
* Napisz procedurę, która sprawdza, czy dana liczba jest pierwsza. | |||
== Laboratorium == | == Laboratorium == | ||
* 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 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 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 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. | * 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ę. | * 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 10:53, 5 paź 2006
Praca domowa
- Stopień parzystości liczby całkowitej to największa taka liczba naturalna , że 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):
- Sumy kolejnych liczb nieparzystych dają kwadraty kolejnych liczb naturalnych, zgodnie ze wzorem: . Wykorzystaj ten fakt do napisania procedury sqrt obliczającej sqrt x Parser nie mógł rozpoznać (nieznana funkcja „\floor”): {\displaystyle = \floor{\sqrt{x}}} .
- Napisz procedurę, która sprawdza, czy dana liczba jest pierwsza.
Laboratorium
- 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 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 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ę.