Citation:
Envoyé par
kbprince
il y a plein d'expression que je ne comprend pas dans votre vocabulaire, comme le ( begin )et le (implicite et explicite),
:google: 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:
Actually, the begin statement is not necessary in the test function above, since Scheme allows one to have a sequence of expressions as the body of a function, although the begin may make the code clearer.
Lorsque le code contient explicitement un appel à la fonction 'begin', on dit que c'est un 'begin' explicite.
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:
pour le cond , j'aime pas l'utiliser parce que je sais pas comment classer les événements du traiment de la fonction,
Je ne comprends pas 'classer les événements du traiment de la fonction'
Citation:
car d'aprés le mon prof , le cond remplace plusieur (if).
Oui. C'est une manière de voir les choses.
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:
Apparemment, je me retrouve au point de départ du projet , et le travail qui me reste à faire n'est pas du gâteau.
Je confirme!
Citation:
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.
Je confirme!
Citation:
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 ).
C'est le point crucial!!!
Dans l'arbre du corps d'une fonction comme:
Code:
1 2 3 4
| (define (fact1 a)
(if (= a 0)
1
(* a (fact1 (- a 1))))) |
l'appel (récursif) de 'fact1' est encapsulé dans un appel à '*' (qui n'est pas ignorable) lequel est encapsulé dans un appel à 'if' (qui est ignorable).
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:
1 2 3 4 5 6
| (define (membre a l)
(if (not (pair? l))
#f
(if (eq a (car l))
#t
(membre a (cdr l))))) |
l'appel (récursif) de 'membre ' est encapsulé dans un appel à 'if' (qui est ignorable) lequel est encapsulé dans un appel à un autre 'if' (qui est aussi ignorable).
conclusion: l'appel n'est imbriqué sous aucune fonction non-ignorable, l'appel est donc récursif terminal.
Citation:
Citation:
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 .
ce n'est malheureusement pas si simple!...