// Sesión 2: funciones que cuentan sus propias llamadas.
//
// En todas, calls apunta a un contador que inicializa quien llama. Cada llamada a la
// función recursiva le suma 1, como primera instrucción. Así no hace falta una global.
#ifndef COUNTED_H
#define COUNTED_H

#include <stddef.h>

// base elevado a n, con una llamada por cada unidad de n. Requiere n >= 0.
long long power_slow(long long base, int n, long *calls);

// base elevado a n, partiendo n por la mitad. Requiere n >= 0.
// El caso base es n == 0, y cada llamada hace a lo sumo una llamada recursiva.
// La función recursiva es esta misma: power_fast cuenta sus propias llamadas.
long long power_fast(long long base, int n, long *calls);

// Dónde está value en los n elementos de a, o -1 si no está. Mira de izquierda a derecha.
long linear_search(const int *a, size_t n, int value, long *calls);

// Dónde está value en los n elementos de a, que están ordenados de menor a mayor,
// o -1 si no está. Si se repite, devuelve cualquiera de sus posiciones.
// Se cuentan las llamadas a la función auxiliar recursiva.
long binary_search(const int *a, size_t n, int value, long *calls);

#endif
