Bonjour!
Alors voici l'énoncé de l'exercice:
A. Définir une fonction qui construit, à partir d'une liste incluant des sous-listes, la liste des sous-listes commençant par un nombre ; exemple :
Astuce : utilisez la fonction numberp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part (nombre '((2 d b) c (d) (4 f) (e g x) f)) => ((2 d b) (4 f))
Et la fonction and :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (numberp 3) => t (numberp 'abd) => nil
Et n'oubliez pas de tester si on a affaire à une liste...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (and a b) => nil; si l'un des deux atomes est nil (and a b) => t; si les deux atomes sont non nil
fin énoncé
Alors voila ce que j'ai écris:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 (defun nombre (liste) (cond ((atom liste) nil) ((listp liste) ((numberp (car (car (liste))))) (cons (car liste) (nombre (cdr liste)))) (t (nombre (cdr liste))) ) )
problème 1: Ça me renvoie
Ça me renvoie ça alors que pas ici mais dans le terminal j'ai respecté le prety-print, c'est-à-dire j'ai mis à la ligne et indenté tout ce qui avait après le listp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 You are in the top-level Read-Eval-Print loop. Help (abbreviated :h) = this list Use the usual editing capabilities. (quit) or (exit) leaves CLISP. ((atom liste) nil) You are in the top-level Read-Eval-Print loop. Help (abbreviated :h) = this list Use the usual editing capabilities. (quit) or (exit) leaves CLISP. ((listp liste) ((numberp (car (car (liste))))) (cons (car liste) (nombre (cdr liste)))) You are in the top-level Read-Eval-Print loop. Help (abbreviated :h) = this list Use the usual editing capabilities. (quit) or (exit) leaves CLISP. (t (nombre (cdr liste))) ) )
problème 2 :
lorsque je teste ça ne marche pas et j'ai essayé de mettre equal devant le numberp et le listp
Pour moi la logique serait:
condition 1: si l'argument de nombre est une liste vide
condition 2: si l'argument de nombre est une liste,
puis que le premier élément du premier élément de la liste est un nombre, construit la liste avec ce premier élément puis récursivité sur le reste de l'argument liste
condition 3: si on a ni la condition 1 ni la condition 2 on récursive sur le reste de l'argument liste
Donc mon problème c'est que déjà dans la logique je ne vois pas ou je dois utilisé le and
et est ce que le numberp je dois mettre equal ou je laisse comme ça, ça dit tout seul s'il renvoie t je passe à la suite ou il faut un opérateur devant?
Du coup je change et je mets and devant le numberep sans trop savoir pourquoi puis ca me renvoit bien la fonction nombre
Mais en testant ensuite:
Merci pour votre aide!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 *** - system::read-eval-print: variable nombre has no value Rentrées possibles: USE-VALUE :R1 Input a value to be used instead of nombre. STORE-VALUE :R2 Input a new value for nombre. ABORT :R3 Abort main loop
Partager