|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour ,je suis un étudiant en informatique , et j'ai un projet en Lisp que je dois rendre dés la rentré prochaine.
mon projet consiste a écrire un programme qui prend en argument une liste correspondant à une fonction et renvoie #t s'il s'agit d'une récursivité terminale et #f sinon. Attention. j'ai commencé à écrire des fonction récursivité et récursivité terminale (ou récursivité totale ) et j'ai pris ces fonction comme si c'était une liste , ensuite j'ai défini chaque parti de la liste c'est à dire : nom de la fonction , paramètre de la fonction et le corps de la fonction . A partir de sa j'ai sélectionner les différence qu'il y a entre les deux formes de récursivité : Code :
si quelqu'un peu m'aider sur ce programme , Merci à l'avance[/SIZE][/SIZE][/SIZE] |
||
|
|
00
|
|
|
#2 | |||||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Bonjour.
Citation:
Code :
Code :
Elle est beaucoup trop câblée sur la définition de 'somraux'! Comme tu le dis plus loin, ça ne marchera que sur certaines fonctions qui auront la même forme que 'somraux'! Je ne suis pas sûr que ton algorithme soit le bon: 1) rechercher LA fonction dans le corps 2) vérifier si cette fonction est la fonction Il me semble qu'il vaudrait mieux explorer (parser) le corps de la fonction et chercher s'il contient (en position fonctionnelle) une ou plusieurs occurrences de la fonction. En gros, écrire une fonction auxiliaire: Code :
(define (nb-occurrences fct corps) ...) Il est clair que cette recherche est elle-même récursive! |
|||||||
|
|
00
|
|
|
#3 | ||||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour
Merci pour votre réponse. j J'ai essayer de refaire mon programme avec d'autres manières : La 1er c'est de cherche si la fonction contient une fonction chapeau , et elle marche pour toutes les fonction en récusivité terminale mais pas sur toute les fonctions en récusivité normal. Code :
du coup je me suis retourné sur une autre hypothese : l'accumulateur : on sait que dans une fonction en récusivité terminale l'accumulateur est repté au moin trois fois : dans les parametres , la boucle et la fonction vu que le résultat se renvoi toujour dans l'accumulateur . j'ai fai la fusionner la focntion aplatir2 avec compter le nombre de fois ou le mot accumulateur est repété dans la fonction, donc si il repeté plus de 2 fois ( 3 et plus ) #t (terminale ) si non #f . , je sais pas commen dire au programme ( if (< cla 3) #t #f) mais sa ne marche pas aussi . Code :
|
||||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
![]() Afin de faciliter la lecture de ton message, peux-tu l'éditer en ajoutant la balise CODE (le '#' dans la barre d'outils) et en corrigeant les erreurs de frappe? |
|
|
00
|
|
|
#5 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour
Quand je teste si la fonction possede une fonction chapeau sa donne sa pour les fonction non terminale : Code :
#t (vrais) #f (faux). |
||
|
|
00
|
|
|
#6 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Re Bonjour.
Comme je l'ai précisez dans mes messages précédents, j'ai fait une fonction qui aplatir une liste ( enleve les parenthèses) et une autre qui compte le nombre occurrence d'un mot dans une liste. j'ai fusionner ces deux fonction pour faire un fonction qui aplatit la liste puis calcule le nombre occurrence d'un mot. En ce qui me concerne je cherche a savoir combien il y'a le mot acc (accumulateur dans la fonction) , qui est un paramètre indispensable dans une fonction en récusivité terminale. Si ce paramêtre est cité 3 fois ou plus dans la fonction dans c'est de la récusivité terminale si non faux, j'ai fais sa en fonction aparament sa marche sur toute type de fonction puisque les fonction sont aplati elle deviennent des liste simple (un probleme ou pas ? ) Code :
|
||
|
|
00
|
|
|
#7 | |||||||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
C'est pas gagné!
Pour améliorer la lisibilité des messages, pourrais-tu: - utiliser la balise CODE en cliquant sur le '#' dans la barre d'outils du message - mettre un point ou un return à la fin de chaque phrase Ce n'est pas de ta faute si le français n'est pas ta langue maternelle, mais il m'est difficile de comprendre une phrase comme: Citation:
Citation:
Citation:
Que se passe-t-il si quelqu'un écrit une fonction avec le mot 'accu' ou 'ac' plutôt que 'acc', ou écrit une fonction sans variable d'accumulation ou avec plusieurs variables d'accumulation? EDIT: J'ai consulté Wikipedia (pour me rafraîchir la mémoire): Une fonction à récursivité terminale est une fonction où l'appel récursif est la dernière instruction à être évaluée. Pour moi, la fonction 'rac2' est bien récursive terminale: Code :
La fonction 'mult' n'est pas récursive terminale, car elle empile un paquet de 'b' et de '+': Code :
Code :
Il faut, à chaque appel, empiler tout un contexte à restaurer au retour de la fonction. |
|||||||||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Je confirme! Ce n'est pas un problème facile qu'il vous a donné!
Petite précision: il me semble que 'define' est spécifique de scheme et non de lisp. Je n'ai jamais fait de scheme. En particulier, je ne connais pas bien les syntaxes spécifiques. Par exemple, il semble que la syntaxe de la fonction 'if' n'autorise pas un 'progn' implicite (ou un 'begin', semble-t-il, en scheme?), contrairement aux autres lisps. En repartant d'une définition précise de la récursivité terminale, comme celle de wikipedia, voilà ce que je ferais: WP: Une fonction à récursivité terminale est une fonction où l'appel récursif est la dernière instruction à être évaluée. Je commencerais par traiter le cas d'une fonction sans sous-fonction, ce qui n'est déjà pas si simple! 1) (pour s'entraîner) déterminer si une fonction 'fct' (sans sous-fonction) est récursive: parcourir récursivement le corps de 'fct' à la recherche d'un appel à 'fct' (sans aplatir le corps de la fonction) 2) déterminer si une fonction 'fct' (sans sous-fonction) est récursive terminale parcourir récursivement le corps de 'fct' en vérifiant si les appels à 'fct' sont à l'intérieur d'une fonction normale (comme 'cons' '+' etc.) ou d'une fonction ignorable (comme 'if' ou 'cond') et faisant attention au cas particulier du 'begin' (explicite ou implicite). Pour préciser ce dernier point: si un appel à 'fct' est la dernière instruction d'un 'begin' (explicite ou implicite), il ne remet pas en cause la récursivité terminale. si un appel à 'fct' est avant la dernière instruction d'un 'begin' (explicite ou implicite), la fonction n'est pas récursive terminale. si un appel à 'fct' est imbriqué dans une fonction normale, la fonction n'est pas récursive terminale. Rq: le parser (la fonction qui explore récursivement le corps de 'fct') doit être assez intelligent pour reconnaître le type et la structure de chaque noeud de l'arbre: il doit plonger avec un indicateur spécifique dépendant de la fonction (normale (comme '+') ou structure de contrôle (comme 'if')). Pour la fonction 'cond', il doit traiter différemment chaque tête de clause (condition) du reste de la clause ('begin' implicite). etc. 3) déterminer si une fonction 'fct' (avec sous-fonctions) est récursive terminale déterminer si chacune des sous-fonctions est récursive terminale (cf. 2) vérifier la récursivité croisée (fct1 appelle fct2 qui appelle fct1) Voilà quelques pistes à développer! Y a du boulot! Bon courage! |
|
|
00
|
|
|
#9 | ||||||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour
D'après ce que je viens de lire il y'a boucaup de travail sur sa sur tout qu'il me reste pas boucaup de temps pour développer tous sa mais je ne baisserai pas les bras ce projet ces 40% de ma note finale pour le module ( programmation fonctionnelle) . Pour la fonction que j'ai faites (define (compter mot phrase)) qui compte le nombre d'occurrence ne fonction que sur des liste vraiment simple qui ne contiennent aucune parenthèse c'est pour sa que j'ai rajouter la fonction (define (aplatir2 e)). il y a plein d'expression que je ne comprend pas dans votre vocabulaire, comme le ( begin )et le (implicite et explicite), pour le cond , j'aime pas l'utiliser parce que je sais pas comment classer les événements du traiment de la fonction, car d'aprés le mon prof , le cond remplace plusieur (if). Apparemment, je me retrouve au point de départ du projet , et le travail qui me reste à faire n'est pas du gâteau. c'est ce que j'essaye de reprendre depuis le début, ce programme contient beaucoup pièges, les fonction récursive sont toutes différentes. en vérifiant si les appels à 'fct' sont à l'intérieur d'une fonction normale (comme 'cons' '+' etc.) ou d'une fonction ignorable (comme 'if' ou 'cond') (j'ai pas compris ou vous voullez en venir ). 3) déterminer si une fonction 'fct' (avec sous-fonctions) est récursive terminale déterminer si chacune des sous-fonctions est récursive terminale (cf. 2) vérifier la récursivité croisée (fct1 appelle fct2 qui appelle fct1) vérifier tout simplement si il y a une fonction chapeau . jJe connais une fonction qui marche sur les liste simplement , cette fonction detail toute les etape de construction d'un liste : Code :
la fonction qui calcule la somme de 4 donne le résultat 10 = 1 + 2 + 3 + 4 en récursivité sa fait : Code :
+ 1 + 2 sa donne 3 + 3 sa donne 6 + 4 sa donne 10 en récursivité terminale sa fait : Code :
En gros : determiner si la fonction est récursive implique deux chose : avoir une boucle , et vérifié qu'on se dérige vers la boucle. deerminer si elle es terminale : appel récursive dernier chose a faire. puis determiner si la terminale a une sous fonction. Je suis Perdu pour l'instant je vais essayé de travailler tous sa , si j'ai d'autre question je vous les transmettrez demain,. Merci |
||||||
|
|
00
|
|
|
#10 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
j'ai trouvé sa dans un site internet je sais même pas si sava m'aider , je vous le transmet comeme.
Code :
|
||
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Désolé, comme tes messages n'utilisent pas les balises QUOTE et CODE, j'ai beaucoup de mal à les lire et je préfère faire un meilleur usage de mon temps et de mon énergie.
Merci d'éditer tes messages et de mettre les balises pour les rendre plus faciles à lire. |
|
|
00
|
|
|
#12 | ||||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Bonjour
Code :
Je cherche à améliorer ma fonction qui compte le nombre d'occurence dans une liste , pour l'instant je suis obligé d'aplatir ma liste pour que la fonction arrive a compter les elements. Je cherche à compter le nombre d'occurence du nom de la fonction , si il es repeté au moin une fois c'est qu'il y a appel récursive normalement . Pour l'accumulateur c'est un peu dificile , parceque le nom de la fonction es bien définit , mais le parametre pour etre n'importe tous , sauf si on suppose par exemple qu'il sois le dernier élement des paramêtres. Code :
ensuite il reste toujour le probleme de comment parcourir les diférentes fonctions pour savoir si c'est vraiment la récursivité est la dernier chose à faire. une fois toute ces etape franchi la 3eme et derniere etape qui vérifie si fct 1 appel fct 2 et fct 2 appel fct1. Merci |
||||
|
|
00
|
|
|
#13 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Voici la fonction qui comptes le nombre d'occurence d'un element dans une liste aplati
Code :
|
||
|
|
00
|
|
|
#14 | |||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Merci beaucoup d'avoir fait l'effort d'utiliser la balise CODE!
Du coup, ça me donne presque envie de répondre... Citation:
Code :
|
|||||
|
|
00
|
|
|
#15 | ||||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
J'ai suivi vos instruction sa me donne toujour le résultat 3 , voici ma fonction plus les exemple
Code :
Code :
|
||||
|
|
00
|
|
|
#16 | |||||||||||||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Citation:
est votre ami:http://www.cs.bham.ac.uk/research/pr...ex_scheme.html http://www.cs.bham.ac.uk/research/pr...re4.html#begin Citation:
Lorsque le code contient une forme (comme 'define' ou le 'cdr' d'une clause de 'cond') qui autorise une séquence d'instructions et retourne le résultat de la dernière, on dit que c'est un 'begin' implicite. Citation:
Citation:
Il y a plusieurs "écoles": - ceux qui considèrent que la "vraie" primitive est le 'cond' est que le 'if' n'est qu'un cas particulier dégénéré et programmable à partir du 'cond' - ceux qui considèrent que la "vraie" primitive est le 'if' est que le 'cond' n'est qu'un cas particulier dégénéré et programmable à partir du 'if'. - ceux qui considèrent que les 2 existent et que chacun a ses avantages et inconvénients. Dans tous les cas, si on te demande d'écrire un programme qui vérifie si la définition d'une fonction quelconque est récursive terminale, il faut bien traiter le cas où le corps de la fonction contient des trucs comme des 'cond', des 'let', etc. Citation:
Citation:
Citation:
Dans l'arbre du corps d'une fonction comme: Code :
conclusion: à cause de la fonction non-ignorable '*', l'appel n'est pas récursif terminal. Dans l'arbre du corps d'une fonction comme: Code :
conclusion: l'appel n'est imbriqué sous aucune fonction non-ignorable, l'appel est donc récursif terminal. Citation:
|
|||||||||||||
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Presque...
Dans: Code :
|
||
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
|
|
|
00
|
|
|
#19 | ||
|
Invité régulier
![]() Rachid IhadadeneÉtudiant Inscription : décembre 2012 Messages : 33 ![]() |
Sa Marche enfin :
Code :
est que cela m'aiderai a prouver que c'est une fonction récursive , pour un début ?! il me restera bien sure le probeleme de comment parcourir les differentes fonction récursives pour determiner si c'est terminale ou pas. pour la derniere etape : vérifier si elle a une fonction chapeau , on a pas besoin de faire le teste sur les fonction qui ne sont pas on Rterminal , Non ?! Merci! |
||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : avril 2008 Messages : 800 ![]() |
Quelle version de scheme utilises-tu?
Concernant le 'begin' implicite, cette référence est bien meilleure: http://www.gnu.org/software/mit-sche...tml#Sequencing Elle donne la liste des fonctions à parser spécialement! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com