Problème en Scheme

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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
    1. 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....
      1. Modérateur
        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))
        )      )
        1. un truc dans ce genre là à mon avis :

          (define (som a n)
          (let a 0)
          (if (zero? n)
          a
          (som (+ a 1)(- n 1)))
          1. Modérateur
            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)
        2. 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....:(
          1. Modérateur
            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 !
          2. à mon avis Magenti doit réfléchir en itératif
          3. Merci pour votre aide !!!! ^^ Maintenant je suis sur les listes et j'ai encore des problèmes mdr XD
          4. Modérateur
            Si tu réfléchis en itératif sur les listes, ça ne m'étonnes pas que tu ais des problèmes !
          5. Alors comment je dois raisonner ? :S