Wstęp do programowania

Transkrypt

Wstęp do programowania
Wieczorowe Studia Licencjackie
Wrocław, 13.11.2006
Wstęp do programowania
Lista nr 6
1.
W oparciu o następującą zależność napisz funkcję rekurencyjną wyznaczającą an. Oszacuj koszt czasowy i
głębokość rekursji.
1
n=0


2 n/2
a =  (a )
n parzyste
a * (a 2 ) n / 2  n nieparzyste

n
2.
3.
4.
5.
6.
7.
Przedstaw drzewo wywołań rekurencyjnej funkcji newton dla argumentów n=6 i m=3.
Ile razy podczas obliczania newton(20,10) zostanie wywołana funkcja newton dla n równego m oraz
m równego zero (chodzi o łączną liczbę takich wywołań).
Napisz funkcję czas(int dd, int mm, int rr), która policzy ile dni upłynęło od 1 stycznia 2000
roku do dnia dd.mm.rr. Twoja funkcja powinna sprawdzać poprawność danych. Pamiętaj o istnieniu lat
przestępnych.
Uwaga: zastanów się, czy zastosowanie rekurencji może uprościć funkcję?
Napisz funkcję dzien(int dd, int mm, int rr), która napisze jaki dzień tygodnia przypadał
(bądź przypadnie) w dniu dd.mm.rr. Możesz założyć, że dd.mm.rr jest datą z bieżącego stulecia.
Napisz funkcję fibonacci(k,l), która jako wartość zwraca najmniejszą wartość p taką, że p-ta liczba
Fibonacciego przy dzieleniu przez k daje resztę l.
Partycją liczby naturalnej nazywamy przedstawienie jej w postaci sumy naturalnych składników.
Przykładowo partycjami liczby 5 są: 1+1+1+1+1, 1+1+1+2, 1+1+3, 1+2+2, 2+3, 1+4, 5. Partycje różniące
się jedynie kolejnością składników uznajemy za takie same (np. 1+2+2 jest tą samą partycją co 2+1+2).
Rozważ poniższą funkcję:
partition(int n)
{ int x, k;
if (n==1 || n==0) return 1;
else
{ x=0;
for(k=1; k<=n; k++) x=x+partition(n-k);
return x;
}
}
Funkcja ta nie wyznacza poprawnie liczby partycji dla n. Wytłumacz dlaczego i przedstaw modyfikację tej
funkcji poprawnie wyznaczającą liczbę partycji.
8. Rozważmy następujący algorytm wyznaczania najmniejszej liczby w ciągu n-elementowym: Jeśli n=1 to
minimum jest równe jedynemu elementowi ciągu. W przeciwnym razie dzielimy ciąg na dwa ciągi (prawie)
równej długości, wyznaczamy minima tych dwóch ciągów m1 i m2 a następnie wybieramy mniejszą z liczb
m1, m2. Napisz funkcję rekurencyjną realizującą ten algorytm. Jaki jest czas działania Twojej funkcji,
porównaj go z czasem działania metody iteracyjnej.
9. Napisz funkcję
int czynnikpierwszy(int n)
sprawdzającą czy liczba n będąca jej parametrem jest liczbą pierwszą. Dla liczby pierwszej n funkcja ma
zwracać wartość n, dla liczby złożonej funkcja zwraca dzielnik liczby n większy od 1 i mniejszy od n.
10. W oparciu o funkcję wyspecyfikowaną w poprzednim zadaniu napisz rekurencyjną funkcję wypisującą
rozkład liczby na czynniki pierwsze.
Uwaga: rozkład na czynniki pierwsze polega na przedstawieniu liczby w postaci iloczynu liczb pierwszych,
np. 90=2*3*3*5, 17=17).

Podobne dokumenty