0
votes

Utilisez la récursion de la queue pour obtenir une composition de fonction répétée

J'ai besoin de définir une fonction (répéter-écriture n f) code> de sorte que ((répéter-écriture n f) x) code> évalue à (f (f (... (f (f x) ...))) code> où il y a des applications n code> de la fonction f code>.

par exemple: p> xxx pré>

évalue à p >

’(5 6)


1 commentaires

Cette réponse ultérieure répond effectivement à la Q.


4 Réponses :


2
votes

Pour commencer, nous pourrions essayer de définir xxx pré>

et aussi p> xxx pré>

et p> xxx pré>

et p> xxx pré>

et p> xxx pré>

Ce n'est pas une raquette valide cependant. Pour commencer, nous ne pouvons pas avoir plusieurs définitions à la fois, dans la raquette, même si elles sont mutuellement exclusives. Nous devons l'écrire sous la forme d'un Cond code>, p> xxx pré>

Ceci est une raquette valide maintenant mais bien sûr toujours insatisfaisante. Et si n code> est supérieur à 4 code>? P>

mais attendez, voyez-vous un motif là-bas? Bien sûr, il fait exactement que nous voulions, pour n = 4 code> il appelle la fonction f code> 4 fois, pour n = 3 code> il l'appelle 3 fois, c'est-à-dire une fois moins de temps que pour n = 4 code>. Donc, écrivons-le en bas: p> xxx pré>

mais c'est aussi pareil que p> xxx pré>

n'est-ce pas? Et ce qui est si spécial sur 4 code> de toute façon, pourquoi devrions-nous être exigeants artificiellement n code> pour être un numéro spécifique, n'est-ce pas n code> qui est plus grand que 0 code> manipulé exactement de la même manière? p>

Alors, nous pouvons maintenant simplifier cela un peu plus, en prenant soin que tous les cas em> sont manipulés, Et c'est ça. P>

Ce n'est pas queue em> -Recursive, oui, mais c'est récursif, et c'est correct em>, qui est la chose la plus importante. Donc, ça vous obtient commencé. Suivez simplement le même modèle de pensée et écrivez la transformation correspondante de la manière récursive de la queue. En particulier, P>

(define ((repeat-compose n f) x)
   (cond
      ((> n 0) (   (repeat-compose (- n 1) f) (____ x) ))
                ;; --------------------------  ^^^^ fill the blanks


5 commentaires

Gotcha .. cela satisfait certainement l'exemple, mais je me demande comment la récursion de la queue peut être utilisée dans cette ..


Eh bien, ce n'est pas récursif de la queue, mais c'est récursif, et c'est correct, ce qui est la chose la plus importante. Donc, ça vous obtient commencé.


Super, merci pour votre aide! Je vais essayer de construire sur ça ..


Je reçois l'erreur ci-dessous lorsque j'essaie d'exécuter le code final, comment puis-je passer cela? `` `Définir: attendu le nom de la fonction, mais a trouvé une partie` `` ``


Pour une nouvelle question avec le nouveau code, veuillez poster la nouvelle question dans un nouveau poste séparé, y compris toutes les informations et les codes pertinents, éventuellement avec un lien vers ce poste pour référence en arrière-plan.



3
votes

solution récursive queue pour répéter-compose code> sans utiliser composer code>

Nous définissons une fonction locale locale reconsive de la queue % répétez-la compose Code> et mettre un lambda code> autour de son appel pour renvoyer une fonction curryfied. p> xxx pré>

Essayons: p>

(define (repeat-compose n f)
  (lambda (x) ((apply compose (make-list n f)) x)))

((repeat-compose 3 cdr) '(1 2 3 4 5))
;; '(4 5)


2 commentaires

Veuillez modifier votre réponse à utiliser list pour (liste FFFFFF) et non ' "citation qui tourne chaque f F symbole au lieu d'une fonction


Quelle réponse sauvage et énergique;)



2
votes

Utiliser pour / pli est également une option: xxx

en utilisant: xxx < / pré>


0 commentaires

1
votes

Le la fonction est destiné exactement à ce genre de chose: xxx

=> '(5 6 )

puissance fonctionne pour n'importe quel type et composition, non seulement la composition de fonction.

[Divulgation: je suis le Auteur de cet utilitaire]


5 commentaires

Est-ce qu'il utilise l'exponentiation par une quart répétée, pour créer des représentations plus compactes des fonctions construites lorsque n est grand?


@Willness ne connaissait pas cette optimisation mais c'est brillant. Cela ne le fait pas actuellement de cette façon, mais je souhaiterais absolument y ajouter cela.


Oui, j'ai juste eu cette pensée pop dans ma tête de retour quand je lisais votre réponse. :)


En fait, c'était dans le contexte de l'écriture cette réponse .


Merci d'avoir partagé :)