garulfo regarde mon dernier code , il est presque juste , j'ai juste des difficultés à construire mon doublet de fin , tu as une idée ?
garulfo regarde mon dernier code , il est presque juste , j'ai juste des difficultés à construire mon doublet de fin , tu as une idée ?
Je doute qu'ils soient débiles.
Le terme « fonction auxiliaire » n'est pas propre à Scheme. Comme son nom l'indique c'est une fonction qui fait une partie du travail. Tu pourrais retrouver ça dans n'importe quel langage. Tu n'es pas obligé non plus de créer ta fonction dans une autre fonction. Donc même si on ne t'en a jamais parlé ni jamais montré de tels exemples tu peux t'en sortir.
Fais attention aux solutions que tu trouves ici. Ton prof pourrait croire que tu as tricher en faisant quelque chose que tu n'étais pas censé connaître et que donc tu as eu de l'aide. Ce qui serait dommage car ici ce n'est pas le cas.
Bon reprenons ton exemple et réécrivons le simplement en sortant la définition de la fonction interne
Et ça marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 (define (paire L) (if (pair? L) (if (even? (car L)) (+ 1 (paire (cdr L))) (paire (cdr L))) 0 ) ) (define (P-I L) (cons (paire L) (cons(- (paire L) L)) )
Attention à indenter correctement ton code ! <Ctrl+I> dans DrScheme si tu es sur Windows ou Linux.
cons crée une paire.
list crée une liste (une paire de paire, qui termine par une liste vide)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 > (cons 2 3) (2 . 3)
Si tu réfléchis bien tu vas trouver ta solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 > (list 2 3) (2 3) ;; c'est a dire (2 . (3 . ()))
Je te laisse un peu mariné et je reviens tantôt.
rassure toi garulfo je ne triche pas car 1. je recopie jamais les codes fournis ici , 2. sur 50 exercices j'arrive à en faire 40 , je viens vraiment quand j'ai fait plusieurs essais et qu'aucun ne marche .
et garulfo non ça marche pas , j'avais déjà tenté ta solution , regarde l'erreur qu'on a avec ta modification pour ce test (fonction (list 1 2 3 4 5))
-: expects type <number> as 1st argument, given: (1 2 3 4 5); other arguments were: 2
non franchement j'ai beau mariner comme tu dis et avoir essayé 50 trucs aucun ne marche , j'ai sans arrêt :
expects type <number> ...
Je n'ai pas dit que tu trichais. J'ai justement ajouté « Ce qui serait dommage car ici ce n'est pas le cas ».
Tu n'as pas cherché. Tu as simplement essayé de remplacer l'un par l'autre.
Lis bien mes commentaires.
Pour créer une liste tu as deux façons de faire: une avec list une avec cons. Ce sont deux opérateurs qui fonctionne ensemble. En fait, seul cons est nécessaire.
Une liste est une succession de cons
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 > (cons 'a '()) (a) > (list 'a) (a)
La solution est très très simple à ton problème. C'est juste que tu visualises mal le résultat.
Ah non attends... il y a un problème de parenthèsage.
Que comptes tu faire ici ?
Parce que (- (paire L) L) ça n'a pas de sens.
Code : Sélectionner tout - Visualiser dans une fenêtre à part (cons (paire L) (cons (- (paire L) L)))
Ah oui... et donnes des noms qui ont du sens à tes fonctions.
paire c'est un mauvais nom.
chercher-premier-nombre-pair c'est un bon nom.
ce que je compte faire c'est construire le doublet des nombres pairs et impairs , les nombres pairs c'est (paire L) , et les nombres impairs c'est censés etre :
(- L (paire L) )) , mais comment mettre ces 2 résultats dans un doublet bon sang je vois pas ya rien à faire .... ( j'ai corrigé et remis le L avant , j'espère que là ça a du sens ) .
Laisse tomber le deuxième cons, et tu vas voir, comme il l'a été mentionné, que (- (paire L) L) ne fonctionne pas.
(fonction (list 1 2 3 4 5))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 (define (fonction L) (cons (paire L) (- L (paire L) )) )
. -: expects type <number> as 1st argument, given: (1 2 3 4 5); other arguments were: 2
Ce qui n'a pas de sens c'est que on ne peut pas soustraire (opération -) une liste et un élément !
Ok en fait, je n'avais pas vu que ton problème était plus profond.
Ce que tu essayes de faire c'est par (- L (paire L)) de retourner la liste qui suit dans L le premier élément (paire L) rencontré. Tu vois c'est pour ça qu'il faut écrire en français et avoir des fonctions qui portent des noms significatifs.
Supposons que tu ais une telle fonction sous-liste-a-la-premier-occurence-de ça marcherait.
Le problème maintenant est pour toi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 (define (chercher-premier-nombre-pair L) (if (pair? L) (if (even? (car L)) (+ 1 (chercher-premier-nombre-pair (cdr L))) (chercher-premier-nombre-pair (cdr L))) 0 ) ) (define (P-I L) (cons (paire L) (sous-liste-a-la-premier-occurence-de (chercher-premier-nombre-pair L) L))) )
1) soit de garder le même algo et de coder sous-liste-a-la-premier-occurence-de
2) de changer ton algo ...
Je pense que je te conseillerais la premier chose car c'est plus simple dans un premier temps.
Après tu pourrais en fait trouver à améliorer ton algo une fois que tu en as un qui marche, car il y a mieux à faire en renvoyant à la fois le premier élément paire trouvé ET la sous-liste qu'il reste à parser
réfléchissons , cons admet en argument une donnée de n'importe quel type et une liste , donc ça ça devrait marcher mais non !!!!! :
(cons (paire L) (list(- L (paire L) )) )
c'est ce signe - qui ne va pas ...
non pas du tout...j'ai expliqué ce que je voulais faire , mais merci bien à vous j'abandonne j'en ai plus qu'assez de cet exercice j'ai pas envie d'y passer la semaine , je voulais partir sur l'idée de base de jim , j'avais pondu un code mais si faut tout rechanger je laisse purement tomber , encore merci bien de votre aide .Ok en fait, je n'avais pas vu que ton problème était plus profond.
Ce que tu essayes de faire c'est par (- L (paire L)) de retourner la liste qui suit dans L le premier élément (paire L) rencontré. Tu vois c'est pour ça qu'il faut écrire en français et avoir des fonctions qui portent des noms significatifs.
Il y a une autre solution très simple à tout ça.
C'est de reconstruire ce qu'on appelle un filtre.
Il y a même une fonction déjà codée. Mais c'est peut-être justement vers où veux vous emmener votre prof.
En fait, c'est souvent le but de cet exercice et la plus simple des solutions.
Je raconte n'importe quoi moi -_-
J'avais mal lu l'énoncé
garulfo , voici un code qui extrait la liste pair et un qui extrait la list e impair , saurais tu écrire une petite fonction qui m'affiche ces 2 listes sous forme d'un doublet ? :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 (define (one L) (if (pair? L) (if (even? (car L)) (cons (car L) (one (cdr L))) (one(cdr L))) (list))) (define (two L) (if (pair? L) (if (odd? (car L)) (cons (car L) (two (cdr L))) (two(cdr L))) (list)))
Bon regarde... la meilleure solution (pour ton niveau) est celle-ci.
Si tu voulais compter uniquement les nombres pairs, tu ferais ça
fonction : compter-nombre-pair
entrées : une liste de nombre L
sorties : un entier représentant le nombre de nombres pairs dans la liste n
algo :
1) si la liste est vide, n=0
2) sinon si le premier élément est un nombre pair alors
n=1 + n'
où n' est le nombre de nombres pairs dans la suite de la liste
3) sinon n est le nombre de nombres pairs dans la suite de la liste.
Est ce que tu saurais implémenter ça ?
Si oui la solution à ton problème est aisée à trouver en modifiant légèrement cette fonction.
non j'abandonne définitivement , merci bcp de ton dévouement .
Oui et je suis sur que toi aussi. Mais arrêtes de donner ce genre de nom à tes fonctions. C'est pour ça que je me suis embrouillé sur l'énoncé. Et ça ne t'aide pas à comprendre ton problème. En supposant que tu l'ais bien compris, ça ne t'aide pas à trouver tes erreurs. Crois moi: le nom d'une fonction c'est essentiel. Dieu a donné à l'homme le pouvoir de nommer qu'ils disent dans la bible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 (define (separer-pair-impair L) ;; c'est bien ca non ? (cons (one L) (two L)) )
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager