2009-10-15 10 views
3

J'ai ce problème à travailler sur:Lisp: Comment écrire un ordre supérieur Fonction

La somme procédure d'ordre supérieur peut être généralisée encore plus loin pour saisir l'idée de combiner les termes avec un opérateur fixe. L'opérateur de produit mathématique est un exemple spécifique de cette idée, avec une multiplication remplaçant l'addition de l'opérateur de sommation. La procédure accumulée, commencée ci-dessous, est destinée à capturer cette idée. Le paramètre combineur représente l'opérateur utilisé pour réduire les termes, et le paramètre de base représente la valeur renvoyée lorsqu'il n'y a plus de termes à combiner. Par exemple, si nous avons déjà mis en œuvre la procédure accumulate, nous pourrions définir la procédure de somme que:

(définir la somme (cumulent + 0))

Compléter la définition de Accumulez de sorte qu'il se comporte selon cette la description.

  (define accumulate 
      (lambda (combiner base) 
       (lambda (term start next stop) 
        (if (> start stop) 
         ... 
         ...)))) 

I inséré comme les deux dernières lignes:

base 
    (combiner base (accumulate (combiner start stop) start next stop)) 

mais, je ne sais pas si cela est correct, ni comment utiliser effectivement la procédure de somme pour appeler accumuler et somme donc des numéros.

+1

N'oubliez pas d'étiqueter vos devoirs avec 'devoirs' –

+0

@PaulMcMillan: Ce n'est pas un vrai tag, Dieu merci! – rvighne

+0

C'était un au point où j'ai fait le commentaire. Apparemment, la politique a changé dans les 5 années intermédiaires. –

Répondre

4

This est un excellent moyen d'apprendre à pêcher. Beaucoup mieux que de donner un poisson.

D'ici là, voici comment aborder le problème. Ecrivez une fonction qui ferait ce que (accumuler + 0) ferait. N'utilisez pas la fonction d'accumulation; écris juste un defun qui fait ce que tes devoirs demandent. Ensuite, écrivez une fonction qui ferait ce que (accumuler * 1) ferait. Quelles sont les similitudes, quelles sont les différences entre les deux fonctions. Pour la plupart, ils devraient être identiques à l'exception des opérateurs + et *. Ensuite, notez que la fonction accumulate consiste à retourner une fonction qui ressemble beaucoup aux deux fonctions que vous avez écrites précédemment. Maintenant, en utilisant l'idée que deux fonctions que vous avez écrites sont très similaires, pensez comment l'appliquer à la fonction que (defun accumulate ...) doit retourner.

Questions connexes