#include #include #define PRVKU 10 int pole[] = {8, 1, 9, 4, 5, 2, 7, 1, 20, 18}; int clenAP(int prvni, int d, int n) { if (n == 1) return prvni; else return clenAP(prvni, d, n-1) + d; } int soucetAP(int prvni, int d, int n) { if (n == 1) return prvni; else return soucetAP(prvni, d, n - 1) + clenAP(prvni, d, n); } /* Funkce vyhledá pozici čísla v poli a vrátí jí. Pokud pole hodnotu neobsahuje, vrátí -1. l, r = pozice od, do, kde máme v poli hledat */ int hledej(int l, int r, int cislo) { if (l == r) { if (pole[l] == cislo) return l; else return -1; } else { if (pole[l] == cislo) return l; else return hledej(l+1, r, cislo); } } /* Úsporněji hledej() */ int hledej2(int l, int r, int cislo) { if (l == r) return (pole[l] == cislo)? l : -1; else return (pole[l] == cislo)? l : hledej(l+1, r, cislo); } /* Vyhledá prvek v poli tak, že jej rozdělí na půl a hledá v každé polovině zvlášť. Pokud se zadá pole o délce 1, tak provede vyhledání ručně. */ int hledej3(int l, int p, int cislo) { int pos; if (l == p) return (pole[l] == cislo) ? l : -1; else {// jen pro přehlednost if ((pos = hledej3(l, (l+p)/2, cislo)) != -1) return pos; else return hledej((l+p)/2+1, p, cislo); } } /* Stejné jako hledej3(), ale pokud má pole dva prvky, tak hledá prvek ručně a ne rekurzí. */ int hledej4(int l, int p, int cislo) { int pos; // Pole má 1 prvek if (l == p) return (pole[l] == cislo) ? l : -1; // Pole má 2 prvky else if (p - l == 1) { if (pole[l] == cislo) return l; if (pole[p] == cislo) return p; return -1; } // Pole má 3 a více prvků else {// jen pro přehlednost if ((pos = hledej3(l, (l+p)/2, cislo)) != -1) return pos; else return hledej((l+p)/2+1, p, cislo); } } int main() { int i; for (i = 0; i < PRVKU; i++) { if (i) printf(", "); printf("%d", pole[i]); } printf("\n"); for (i = 0; i < PRVKU; i++) { printf("Prvek: %d, pozice: %d\n", pole[i], hledej4(0, PRVKU, pole[i])); } printf("Prvek: 999, pozice: %d\n", hledej4(0, PRVKU, 999)); /* for (i = 10000; i < 10100; i++) { printf("%d: %d\n", i, soucetAP(5, 3, i)); } */ return 0; }