This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:2015:recursion-solutions [2015/11/26 12:25] pkleczek [Zadanie PRI] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Rekurencja – rozwiązania ====== | ||
- | Laboratorium: **[[dydaktyka:cprog:2015:recursion|klik]]** | ||
- | |||
- | ===== Zadanie FACT ===== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int silnia(int n) | ||
- | { | ||
- | if (n == 0) { | ||
- | return 1; | ||
- | } else { | ||
- | return n * silnia(n - 1); | ||
- | } | ||
- | } | ||
- | |||
- | int main () | ||
- | { | ||
- | int n = 5; | ||
- | |||
- | printf("%d! = %d\n", n, silnia(n)); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadanie PRI ===== | ||
- | |||
- | Poniższa wersja jest odrobinę bardziej elegancka w stosunku do tego, co omawialiśmy na laboratorium. \\ | ||
- | W tej wersji właściwa funkcja rekurencyjna została "opakowana" tak, aby dla końcowego użytkownika sprawdzanie "pierwszości" liczby było możliwie intuicyjne. | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | /* wlasciwa funkcja rekurencyjna - chodzi o to, aby wywolywac glowna funkcje | ||
- | w mozliwie intuicyjny (a wiec tylko z jedym argumentem - `n`) */ | ||
- | int pierw(int n, int i) | ||
- | { | ||
- | if (i == n) { | ||
- | // Sprawdzilismy wszystkie liczby 2, 3, ..., n-1 i... zadna nie jest | ||
- | // dzielnikiem `n`! | ||
- | return 1; | ||
- | } | ||
- | |||
- | /* else */ | ||
- | if (n % i == 0) { | ||
- | // `i` jest dzielnikiem! | ||
- | return 0; | ||
- | } | ||
- | |||
- | return pierw(n, i + 1); | ||
- | } | ||
- | |||
- | /* glowna funkcja sprawdzajaca */ | ||
- | int czy_pierwsza(int n) | ||
- | { | ||
- | if (n == 0 || n == 1) { | ||
- | return 0; | ||
- | } else { | ||
- | // sprawdz dzielniki 2, 3, ..., n-1 (tj. sprawdzanie "w gore") | ||
- | return pierw(n, 2); | ||
- | } | ||
- | } | ||
- | |||
- | int main () | ||
- | { | ||
- | int n = 4; | ||
- | |||
- | printf("Czy %d jest liczba pierwsza? - %d\n", n, czy_pierwsza(n)); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadanie SUM ===== | ||
- | |||
- | <code> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int sumuj_cyfry(int n) { | ||
- | |||
- | int ostatnia_cyfra; | ||
- | |||
- | if (n == 0) { | ||
- | return 0; | ||
- | } | ||
- | |||
- | ostatnia_cyfra = n % 10; | ||
- | |||
- | return ostatnia_cyfra + sumuj_cyfry(n / 10); | ||
- | } | ||
- | |||
- | int main () | ||
- | { | ||
- | int n = 196; | ||
- | |||
- | printf("Suma cyfr %d wynosi %d.\n", n, sumuj_cyfry(n)); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadanie BIN ===== | ||
- | |||
- | <code> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | void do_binar(int n) | ||
- | { | ||
- | // Zapamietaj cyfre na danej pozycji. | ||
- | int r = n % 2; | ||
- | |||
- | if (n >= 2) { | ||
- | do_binar(n / 2); | ||
- | } | ||
- | |||
- | // Wypisuj cyfry "od końca", czyli od cyfry najbardziej znaczącej | ||
- | // (oznaczającej największą potęgę liczby 2). | ||
- | printf("%d", r); | ||
- | } | ||
- | |||
- | int main() | ||
- | { | ||
- | int n = 7; | ||
- | do_binar(n); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> |