Me pregunto si es posible definir una función recursiva sin llamar a la función en sí misma en su cuerpo pero de alguna manera usar call/cc en su lugar? Gracias.¿Es posible usar call/cc para implementar la recursión?
Respuesta
Puede implementar un combinador en Y usando call/cc
, as described here. (! Muchas gracias a John Cowan para mencionar este post puro) Citando ese puesto, aquí está la ejecución de Oleg:
Corolario 1. combinador Y a través de
call/cc
- combinador Y sin un auto-aplicación explícita.(define (Y f) ((lambda (u) (u (lambda (x) (lambda (n) ((f (u x)) n))))) (call/cc (call/cc (lambda (x) x)))))
caso, se utilizó un hecho que
((lambda (u) (u p)) (call/cc call/cc))
y
((lambda (u) (u p)) (lambda (x) (x x)))
son observacionalmente equivalente.
Tu pregunta es un poco vaga. En particular, parece que desea un sistema que modele llamadas recursivas sin realizar directamente llamadas recursivas, utilizando call/cc. Sin embargo, resulta que puede modelar llamadas recursivas sin hacer llamadas recursivas y también sin usar call/cc. Por ejemplo:
#lang racket
(define (factorial f n)
(if (= n 0) 1 (* n (f f (- n 1)))))
(factorial factorial 3)
Puede parecer una trampa, pero es la base del combinador Y. ¿Quizás puedas ajustar el conjunto de restricciones en las que estás pensando?
P.S .: si esto es tarea, por favor citeme!
Bueno, ya he sabido este truco para hacer recursividad. Lo que me pregunto es si existe una forma no autorreferente de usar call/cc para definir una función recursiva, digamos 'factorial'. ¡Este no es un ejercicio de tarea! Gracias. – day
@plmday La solución de John ya no se autorreferencia. ¿Qué más necesitarías de 'call/cc'? –
@ SamTobin-Hochstadt Bueno, es así, 'f' se refiere a sí mismo, ¿no es así?Quiero ver hasta dónde podemos llegar con 'call/cc', en particular, dada su capacidad, podemos emplearlo para simular la forma usual o inusual de definir una función recursiva. – day
Me temo que call/cc
realmente no tiene mucho que ver con esto. Realmente hay solo dos formas de definir una función recursiva:
- Supongamos que su lenguaje permite definiciones de funciones recursivas; es decir, un cuerpo de función puede referirse a la función de encerrar, o el cuerpo de una función
f
puede referirse a una funcióng
cuyo cuerpo se refiere af
. En este caso, bueno, solo escríbelo de la manera habitual. - Si su lenguaje prohíbe ambos, pero todavía tiene funciones de primera clase y lambdas, entonces puede usar un fixed-point combinator como el combinador Y. Usted escribe su función para que tome como argumento adicional una función que representa el paso recursivo; cada lugar donde recurrirías, en cambio invocas ese argumento.
Así que para factorial
, se escribe así:
(define (factorial-step recurse n)
(if (zero? n)
1
(* n (recurse (- n 1)))))
La magia del combinador Y es que construye la función recurse
que se alimenta a factorial-step
.
- 1. ¿Es posible la recursión con XML Literals en VB.NET?
- 2. ¿Es posible usar jQuery para leer metaetiquetas?
- 3. ¿es posible usar xs: union para complexTypes?
- 4. ¿Es posible usar Java para crear dll?
- 5. ¿Es posible usar Ajax para cargar archivos?
- 6. ¿Es posible implementar eventos en C++?
- 7. ¿Es posible implementar mixins en C#?
- 8. ¿Es posible implementar aplicaciones Silverlight en Android?
- 9. ¿La recursión es buena en SQL Server?
- 10. ¿Es posible usar TTS en iOS
- 11. Capacidad de PHP para manejar la recursión
- 12. ¿Es posible la recursión de cola si una comparación depende del valor de retorno?
- 13. ¿CUDA es compatible con la recursión?
- 14. ¿es una buena práctica usar iframe para implementar header/navbar?
- 15. ¿Es posible implementar X-HTTP-Method-Override en ASP.NET MVC?
- 16. ¿Cuál es la puerta de enlace de pago más simple posible para implementar? (usando Django)
- 17. ¿Es posible usar re2 desde Python?
- 18. ¿Debo usar el enhebrado y la recursión juntos?
- 19. ¿Es posible implementar el bloqueo de ámbito en C#?
- 20. Sobrecarga de recursión: ¿qué tan serio es?
- 21. ¿Es posible implementar compras en la aplicación solo para un subconjunto de países?
- 22. ¿Es posible usar un dispositivo para ejecutar una aplicación exclusivamente?
- 23. ¿Es posible usar Resharper para eliminar un inicializador de objetos?
- 24. ¿Es posible usar SYB para transformar el tipo?
- 25. es posible usar CNAME (alias) para <host:port>
- 26. ¿Debo usar git para implementar sitios web?
- 27. ¿Es posible usar continuaciones para hacer que foldRight tail recursive?
- 28. ¿Es posible usar Netbeans para trabajar en proyectos VB6?
- 29. ¿Es posible usar un JSP como plantilla para un servlet?
- 30. ¿Es posible usar read_csv para leer solo líneas específicas?
Increíble, exactamente lo que quiero. Muchas gracias. – day
@wberry He decidido encontrar una forma de citar ese fragmento de código que, con suerte, es más "compatible con el uso justo". –
Muy bien, gracias. – wberry