Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/04/2008, à 22:45

Madlyn

fonction recursive pr puissance en C

bonjour à tous,
j'ai un exo à faire en C: realiser une fonction recursive de calcul de puissance.
Or quelques propriétés nous sont énumérées et on est obligés de les exploiter.

La compilation ne pose aucun problème... mais si je lance ./puissance 3 2 j'ai le droit au fameux Erreur de segmentation (core dumped).

Pouvez vous m'aider? Apparement le problème vient de ma fonction puissance.

#include <stdio.h>
#include <stdlib.h>

double puissance (double x, int k)
{
	if (k == 0) return (double)1;
	else if (k == 1) return x;
		else if (k < 0) return (double)(1/(x*k));
			else if ((k%2) == 0) return puissance((double)(x*k/2),2);
				else return puissance((double)(x*k-1),x);
}

int main(int argc, char *argv[])
{
	if (argc != 3) 
	{
		return printf("\nErreur : nombre invalide d'arguments");
		return(EXIT_FAILURE);
	}
	float a = (atof)(argv[1]);
	int b = (atoi)(argv[2]);
	double c = puissance(a,b);
	printf("%f",c);
	return(EXIT_SUCCESS);
}

Hors ligne

#2 Le 01/04/2008, à 23:24

mrlem

Re : fonction recursive pr puissance en C

Rajoute donc un petit :

printf ("(%f, %i)\n", x, k);

... au début de ta fonction puissance et tu découvriras la chose la plus importante sur la récursivité.

Hors ligne

#3 Le 01/04/2008, à 23:32

Le Farfadet Spatial

Re : fonction recursive pr puissance en C

Salut à tous !

   Bon, pédagogiquement, c'est mal ce que je fais, mais comme je ne me sentais pas de me taper l'exécution pas-à-pas de ton programme, je t'ai concocté ma version personnelle :

#include <stdio.h>
#include <stdlib.h>

double puissance (double x, int n) {
  double dummy;

  if (n == 0) return 1.;
  if (n == 1) return x;
  if (n < 0) return puissance(1. / x, -n);
  dummy = puissance(x, n / 2);
  dummy *= dummy;
  return (n % 2 == 0)? dummy: dummy * x;
}  // puissance

int main(int argc, char *argv[]) {
  double x;
  int n;

  if (argc != 3) {
    return printf("Usage: puissance x n\n");
    return EXIT_FAILURE;
  }

  x = atof(argv[1]);
  n = atoi(argv[2]);
  printf("%f\n", puissance(x, n));

  return(EXIT_SUCCESS);
}  // main

Voici une trace d'exécution :

$ ./puissance-rec 3 2
9.000000
$ ./puissance-rec 2 3
8.000000
$ ./puissance-rec 100 200
inf

Est-ce que cela correspond à ce que tu cherches ?

   À bientôt.

                                                                                                                                             Le Farfadet Spatial

Hors ligne

#4 Le 01/04/2008, à 23:39

Le Farfadet Spatial

Re : fonction recursive pr puissance en C

Salut à tous !

   Oui : fais ce qu'a dit mrlem, ça te fera prendre conscience de deux ou trois petites choses. Ah ! Également : un petit coup de debogueur de temps en temps ne fait pas de mal...

   À bientôt.

                                                                                                          Le Farfadet Spatial

Hors ligne

#5 Le 02/04/2008, à 00:04

Le Farfadet Spatial

Re : fonction recursive pr puissance en C

Re-re-salut à tous !

   Puisque j'ai voulu faire le malin, autant le faire jusqu'au bout. Donc, je te propose une version de meilleure qualité :

#include <stdio.h>
#include <stdlib.h>

double puissanceRec (double x, int n) {
  double dummy;

  switch (n) {
  case 0: return 1.;
  case 1: return x;
  default:
    dummy = puissanceRec(x, n / 2);
    dummy *= dummy;
    return (n % 2 == 0)? dummy: dummy * x;    
  }
}  /* puissanceRec */

double puissance (double x, int n) {
  return (n < 0)? puissanceRec(1. / x, -n): puissanceRec(x, n);
}  /* puissance */

int main(int argc, char *argv[]) {
  double x;
  int n;

  if (argc != 3) {
    printf("Usage: puissance x n\n");
    return EXIT_FAILURE;
  }

  x = atof(argv[1]);
  n = atoi(argv[2]);
  printf("%f\n", puissance(x, n));

  return EXIT_SUCCESS;
}  /* main */

À bientôt.

                                                                                                                                             Le Farfadet Spatial

Dernière modification par Le Farfadet Spatial (Le 02/04/2008, à 08:00)

Hors ligne