User Tools

Site Tools


dydaktyka:cprog:2015:recursion-solutions

This is an old revision of the document!


Rekurencja – rozwiązania

Laboratorium: klik

Zadanie FACT

#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;
}

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.

#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;
}

Zadanie SUM

#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;
}

Zadanie BIN

#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;
}
dydaktyka/cprog/2015/recursion-solutions.1448537175.txt.gz · Last modified: 2020/03/25 11:46 (external edit)