es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible crear una función recursiva anónima en Racket?

Si tengo una función recursiva como esta:

(define (double-n-times x n)
  (if (= n 0)
      x
      (double-n-times (* 2 x) (- n 1))))

¿Cómo puedo hacer una versión lambda de ella y nunca darle un nombre? … como si quisiera ponerla en línea en algún lugar. ¿Es eso posible? (Quiero decir que en este caso podría usar fold, por lo que tal vez el ejemplo no sea tan bueno) – ¿Hay algún tipo de símbolo o marcador de posición para “self” que no he encontrado? ¿O simplemente tienes que darle un nombre?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible crear una versión lambda de esta función recursiva y utilizarla en línea sin asignarle un nombre. Aquí tienes un ejemplo de cómo hacerlo:

    ((lambda (f)
       (f f))
     (lambda (self x n)
       (if (= n 0)
           x
           (self self (* 2 x) (- n 1)))))
    

    Este es un ejemplo de cómo utilizar una técnica llamada “Y-combinator” para crear una función lambda recursiva anónima. La primera función lambda toma otra función como argumento y luego la aplica a sí misma (pasándose a sí misma como argumento) para crear la función lambda recursiva. La segunda función lambda es la función recursiva real que queremos crear. La pasamos como argumento a la primera función lambda.

    Ten en cuenta que debemos darle a la función lambda recursiva un parámetro (en este caso “self”) para referirse a sí misma al llamarse recursivamente. No hay ningún símbolo ni marcador de posición para “self” que se pueda utilizar en su lugar.

Comments are closed.