/***************************************************************************
 * File:         rec.c
 * Status:       17-mei-2002, pfk.
 *               17-nov-2010, wlm
 * Beschrijving: Voorbeeld van recursief gebruik van functie.
 *               Bereken Nde macht van X zowel op "conservatieve" wijze als
 *               recursief.
 ***************************************************************************/

#include <stdio.h>
#include <stdlib.h>

float X_tot_de_N_de_conservatief(float X, int N) {
	float product = 1.0;
	int macht;

	if (N >= 0) { /* bereken voor positieve macht of nul */
		for (macht = 1; macht <= N; macht++)
			product *= X;
	} else { /* bereken voor negatieve macht */
		for (macht = 1; macht <= -N; macht++)
			product *= X;
		product = 1.0 / product;
	}
	return product;
}

float X_tot_de_N_de_recursief(float X, int N) {
	if (N == 0)
		return 1.0; /* STOPcriterium */

	if (N > 0)
		/* bereken voor positieve macht */
		return (X_tot_de_N_de_recursief(X, N - 1) * X);
	else
		/* negatieve macht, ga verder met positieve macht */
		return (1.0 / X_tot_de_N_de_recursief(X, -N));
}

int main() {
	float GETAL;
	int MACHT;

	printf("Geef getal (float): ");
	scanf("%f", &GETAL);
	printf("Geef macht (int):   ");
	scanf("%d", &MACHT);

	printf("\nUitkomst %f**%d = %f\n", GETAL, MACHT,
			X_tot_de_N_de_conservatief(GETAL, MACHT));
	printf("Uitkomst %f**%d = %f (recursief)\n", GETAL, MACHT,
			X_tot_de_N_de_recursief(GETAL, MACHT));
	printf("\nEinde programma.\n\n");

#ifdef _WIN32
	printf("\n\n");
	system("PAUSE");
#endif   
	return (0);
}
