Laboratorium informatyki II. Język Pascal. Semestr letni.
Ćwiczenie 2.
Rekurencja
Cel ćwiczenia: projektowanie algorytmów rekurencyjnych; rekurencja bezpośrednia i pośrednia; przekazywanie parametrów do procedur i funkcji; zarządzanie stosem programu.
1. Opracować funkcję, która dla n Î N wyznacza wartość n! ( n silnia). Nagłówek funkcji:
function Silnia(n: word): typ_funkcji. Wykorzystać zależność rekurencyjną Silnia(n):=
nSilnia(n-1). Przyjmując, że funkcja Silnia jest typu Extended określić maksymalną wartość n, dla której można wyznaczyć n!.
2. Opracować funkcję, która wyznacza n-ty wyraz ciągu Fibonacciego, gdzie:
F(1) = F(2) = 1; F(n) = F(n-1) + F(n-2).
3. Opracować funkcję, która oblicza NWP(a,b) ze wzoru NWP = a, jeżeli b=0, oraz NWP = NWP(b, a mod b), jeżeli b>0.
4. Opracować rekurencyjną procedurę wyznaczania zapisu liczby N w układzie pozycyjnym o podstawie 1 < b < 17. Sposób działania algorytmu: należy odkładać na stosie kolejne wyniki dzielenia liczby N przez b, aż do momentu, gdy pojawi się liczba c = N div b równa zero; wówczas, pierwsza cyfra liczby wynosi N mod b; obliczając w procedurze rekurencyjnej Licz(N,b) resztę N mod b oraz wywołując ponownie procedurę Licz(N,b), dla
N = N div b, otrzymuje się wszystkie cyfry liczby. Wynik przekazać za pomocą łańcucha.
Cyfry większe od 9 kodować za pomocą liter A, B, C, D, E, F. Nagłówek procedury:
procedure Licz(N: word; b: byte).
5. Opracować program, który oblicza wartości dwóch funkcji wzajemnie rekurencyjnych f(x) i g(x) dla x = 3i, gdzie i = 1,2,3,...,20.
g(3x) div 3 dla x <= 30 f(x) = 6 f(x div 6) dla 30 < x <= 60 6(x div 3) dla x > 60 g(2x) div 4 dla x <= 20 g(x) = 4 f(x div 2) dla 20 < x <= 40 x dla x > 40
Na początku funkcji f(x) umieścić instrukcję write('f'), natomiast na początku g(x) instrukcję write('g'). Funkcję f(x) zdefiniować w oparciu o dyrektywę FORWARD.
6. Opracować funkcję obliczającą rekurencyjnie współczynniki dwumianu (x+y)n z trójkąta Pascala. Współczynniki An[k] (dla k=0, 1, 2, ..., n) należy obliczać ze wzorów:
An[0] = An[n] = 1, An[k] = An-1[k-1] + An-1[k], dla k=1,2, ..., n-1. W szczególności, A0[0] = 1; A1[0] = 0, A1[1] = A0[0] + A0[1] = 1 + 0 = 1, itd.
1 n=0; k=0;
11 n=1; k=0, k=1;
121 n=2; k=0, k=1, k=2;
1331 n=3; k=0, k=1, k=2, k=3;