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).