Voilà ce que donne un peu de programmation fonctionnel en C mais c’est du bricolage, recursif(estnul,fact_zero,moins_un,ex_fact,n) calcul n! uniquement à l’aide des 4 fonctions utile pour la récursion, eval(compose(moins_un,&Moins_un),15) calcule la composée de moins_un avec moins_un sur 15. Quand on voit la facilité avec laquelle ça s’écrit en Caml, on voit la différence entre les langages…
[code]#include <stdio.h>
#include <unistd.h>
#include <malloc.h>
/* structure d’une fonction */
struct fonction {
int type; /* si = 1, c’est f, sinon c’est f o suite */
struct fonction *suite;
int (*f)();
};
/* fonctions définissant factorielle */
int estnul(x)
int x;
{
return(x==0);
}
int fact_zero(x)
int x;
{
return(1);
}
int moins_un(x)
int x;
{
return(x-1);
}
int ex_fact(x,y)
int x;
int y;
{
return(x*y);
}
/* evaluation d’une fonction en x */
int eval(g,x)
struct fonction *g;
int x;
{
if (g->type) return((g->f)(x));
else return((g->f)(eval((g->suite),x)));
}
/* composition */
struct fonction *compose(f,g)
int (*f)();
struct fonction *g;
{
struct fonction *res;
res=(struct fonction *)malloc(sizeof(struct fonction));
res->type=0;
res->suite=g;
res->f=f;
return(res);
}
/* fabrication d’une fonction récursive avec les 4 fonctions */
int recursif(t,g,h,ex,x)
int (*t)();
int (*g)();
int (*h)();
int (*ex)();
int x;
{
if ((*t)(x)) return((*g)(x));
else return((*ex)(x,recursif(t,g,h,ex,(*h)(x))));
}
/* essai */
main(argc,argv)
int argc;
char **argv;
{
struct fonction Moins_un;
struct fonction Estnul;
struct fonction Fact_zero;
Moins_un.type=1;
Moins_un.f=moins_un;
Estnul.type=1;
Estnul.f=estnul;
Fact_zero.type=1;
Fact_zero.f=fact_zero;
printf("%d\n",eval(compose(moins_un,&Moins_un),15));
printf("%d\n",recursif(estnul,fact_zero,moins_un,ex_fact,10));
}
[/code]
reste plus qu’à dérécursifier en utilisant la structure, un peu pénible en fait…