Problème en Scheme

Magenti Messages postés 22 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
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 ! ^^

5 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  2. Magenti Messages postés 22 Statut Membre
     
    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
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  4. Arya Dröttningu Messages postés 650 Statut Membre 157
     
    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
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Magenti Messages postés 22 Statut Membre
     
    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
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
    2. Arya Dröttningu Messages postés 650 Statut Membre 157
       
      à mon avis Magenti doit réfléchir en itératif
      0
    3. Magenti Messages postés 22 Statut Membre
       
      Merci pour votre aide !!!! ^^ Maintenant je suis sur les listes et j'ai encore des problèmes mdr XD
      0
    4. KX Messages postés 19031 Statut Modérateur 3 020
       
      Si tu réfléchis en itératif sur les listes, ça ne m'étonnes pas que tu ais des problèmes !
      0
    5. Magenti Messages postés 22 Statut Membre
       
      Alors comment je dois raisonner ? :S
      0