1
votes

Carré des sommes en raquette / schéma

J'écris le carré des sommes en raquette / schéma récursivement. Le code résume correctement les nombres, mais il ne concorde pas correctement. Je ne sais pas ce que je fais de mal. Si je passe 10, ce devrait être 3025.

(define (squareOfSums n)
 (if (= n 0)
  0
   (expt (+ n (squareOfSums (- n 1))) 2)))


2 commentaires

Peut-être parce que toutes les récursions égalisent également leurs sommes partielles?


Additionnez tout d'abord, puis mettez au carré le résultat.


3 Réponses :


4
votes

Vous ne devriez faire la quadrature que une fois , à la fin de la récursivité. Actuellement, votre code est carré à chaque itération . Une façon de résoudre ce problème serait de séparer la partie somme en une procédure d'assistance et de mettre au carré le résultat de son appel. Comme ceci:

(squareOfSums 10)
=> 3025

De plus, saviez-vous qu'il existe un formule pour ajouter tous les nombres naturels jusqu'à n ? C'est une meilleure solution, sans récursivité nécessaire:

(define (squareOfSums n)
  (sqr (/ (* n (+ n 1)) 2)))

De toute façon, cela fonctionne comme prévu:

(define (squareOfSums n)
  (define (sum n)
    (if (= n 0)
        0
        (+ n (sum (- n 1)))))
  (sqr (sum n)))


0 commentaires

1
votes

Voici une version qui, je pense, est idiomatique mais que j'espère que personne ne connaissant les mathématiques n'écrirait:

(define (square-of-sums n)
  (expt (/ (* n (+ n 1)) 2) 2))

Voici la version que quelqu'un connaissant certains mathématiques écrirait: p >

(define (square-of-sums n)
  (let loop ([m n] [sum 0])
    (if (> m 0)
        (loop (- m 1) (+ sum m))
        (* sum sum))))

Je souhaite que les gens ne posent pas de questions sur les devoirs avec des solutions de forme fermée bien connues: cela encourage activement les gens à mal programmer.

p>


0 commentaires

1
votes

Si vous commencez avec votre fonction en écrivant quelques exemples, il sera plus facile de visualiser comment votre fonction fonctionnera.

Voici trois exemples:

(define (sum n)
  (if (= 0 n)
      0
      (+ n (sum (sub1 n)))))

Comme nous pouvons le voir clairement, il y a deux opérateurs que nous utilisons, ce qui devrait indiquer que nous devons utiliser une sorte de fonction d'assistance pour nous aider.

Nous pouvons commencer avec notre fonction principale squareOfSums :

(define (squareOfSums n)
  (sqr (sum n)))

Nous devons maintenant créer la fonction d'assistance.

Le nombre de fois où vous utilisez l'opérateur d'addition dépend de le numéro que vous utilisez. Pour cette raison, nous allons devoir utiliser la récursivité naturelle.

L'utilisation de la récursivité naturelle nécessite une sorte de cas de base pour que la fonction «se termine» quelque part. Dans ce cas, il s'agit de la valeur 0.

Maintenant que nous avons identifié le cas de base, nous pouvons créer notre fonction d'assistance sans problème:

(check-expect (SquareOfSums 0)  0)
(check-expect (SquareOfSums 2)  (sqr (+ 2 1))) ;9
(check-expect (SquareOfSums 10) (sqr (+ 10 9 8 7 6 5 4 3 2 1))) ;3025


0 commentaires