Problème en Scheme

Fermé
Magenti Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 20 juillet 2012 - 12 nov. 2010 à 19:16
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 12 nov. 2010 à 20:57
Bonjour,

J'ai des problèmes avec la récursivité en Scheme, vu qu'il n'y a pas de boucle for ou while....Je voudrais écrire cet algo :

Som=0;
pour i de 1 à n faire
Som=Som+i;
renvoyer Som;

Voilà ce que j'ai déjà écrit, mais ça ne marche pas :

(define (som n)
(let ((Som 0) (i 1))
(if (and (>= i 1) (<= i n))
(+ Som i))
(+ i 1)
(som (- n 1))
)
)

Merci de votre aide ! ^^

A voir également:

5 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
12 nov. 2010 à 20:01
Je pense que for, et while existent en Sheme, mais il est évident qu'un algorithme récursif n'a pas à les utiliser, surtout dans l'approche fonctionnelle du Lisp...

Dans ton algorithme, tu as déjà tout !

Som=0; 
pour i de 1 à n faire 
Som=Som+i; 
renvoyer Som; 


Il suffit de faire une fonction récursive qui prend en paramètre ton n et ta somme, et au fur et à mesure tu décrémentes n, en incrémentant la somme :

Som(n,0) = Som(n-1,n) = ... = Som(0,n+n-1+...+1) = n+n+n-1+...+1
0
Magenti Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 20 juillet 2012
12 nov. 2010 à 20:25
Merci mais mon problème, c'est pas la théorie. J'ai compris mais je sais pas l'écrire en Scheme :S Je pense ne pas en être loin avec la fonction que j'ai mis plus haut mais ça lui plait pas à DrScheme....
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
12 nov. 2010 à 20:31
De ce que j'ai vu, si, tu en es assez loin !
Je ne connais pas Scheme, mais voici en Common Lisp (ce qui est quasiment pareil)

(defun somme (n s)
       (if   (= n 0)
             s
             (somme (- n 1) (+ s n))
)      )
0
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
12 nov. 2010 à 20:35
un truc dans ce genre là à mon avis :

(define (som a n)
(let a 0)
(if (zero? n)
a
(som (+ a 1)(- n 1)))
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
12 nov. 2010 à 20:44
Pour correspondre à mon algorithme, je pense que ton (+ a 1) doit plutôt être (+ a n)
Sinon, c'est peut-être une particularité du Scheme, mais je ne comprends pas (let a 0)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Magenti Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 20 juillet 2012
12 nov. 2010 à 20:36
Merci, là ça marche...je comprends pas, faut que je voie tout ça....je réfléchis en C et là j'ai pas de problème ! L'ennui c'est que le Scheme, ça fonctionne pas pareil malheureusement....:(
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
12 nov. 2010 à 20:38
En C :

int somme(int n, int s=0)
{
   return (n==0) ? s : somme(n-1,s+n);
}

Je ne vois pas la différence !
0
Arya Dröttningu Messages postés 581 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 3 janvier 2019 157
12 nov. 2010 à 20:39
à mon avis Magenti doit réfléchir en itératif
0
Magenti Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 20 juillet 2012
12 nov. 2010 à 20:45
Merci pour votre aide !!!! ^^ Maintenant je suis sur les listes et j'ai encore des problèmes mdr XD
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
12 nov. 2010 à 20:46
Si tu réfléchis en itératif sur les listes, ça ne m'étonnes pas que tu ais des problèmes !
0
Magenti Messages postés 19 Date d'inscription mercredi 3 mars 2010 Statut Membre Dernière intervention 20 juillet 2012
12 nov. 2010 à 20:50
Alors comment je dois raisonner ? :S
0