This is an old revision of the document!
Laboratorium: klik
#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; }
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.
#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; }
#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; }
#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; }