2011-09-14 11 views
6

Según tengo entendido, recurriendo a Clojure sin utilizar el bucle ... la sintaxis recurrente puede no ser un problema para secuencias cortas. Sin embargo, utilizando el bucle ... la sintaxis recurrente es el método preferido para escribir funciones recursivas. Entonces, me gustaría comenzar con el método preferido.Conversión a bucle ... recurrencia recurrente

Sin embargo, he estado luchando para convertir esta función [editar] que devuelve el esqueleto de una secuencia (la estructura de la secuencia sin sus valores)

(defn skl 
    [tree] 
    (map skl (filter seq? tree))) 

probado con estos datos

(def test_data1 '(1 (2 3) () (()) :a)) 
(def test_data2 '(1 2 (3 4) (5 (6 7 8)))) 

para repetir .. sintaxis recurrente. Cualquier idea o punteros a ejemplos sería apreciada.

Respuesta

3

Es posible que desee buscar en la biblioteca de cremallera que permite una buena estructuración de árbol estructurado, aunque es probable que sea menos elegante que su original. Casi nunca necesito usar loop ... recurre. Casi siempre hay una función de orden superior que resuelve el problema de forma más elegante con la misma o mejor eficacia.

Reemplazando map con loop ... recur hace que el código sea más detallado y menos claro. También pierdes los beneficios de las secuencias fragmentadas.

+0

Gracias. Te refieres a Clojure.zip, ¿verdad? Lo sé, lo usaré y quería hacer este ejercicio sin él. – octopusgrabbus

+0

El trampolín es también una función interesante de conocer, además de recurrir al bucle, aunque aquí no es directamente aplicable. –

4

Loop y recur es una transformación de una iteración simple. Sin embargo, descender a un árbol es intrínsecamente recursivo. Debería mantener una pila manualmente para transformarla en una única iteración. Por lo tanto, no hay una conversión "simple" para su código.

+0

Gracias. Conozco Clojure.zip, pero quería intentar extraer el esqueleto lanzando el mío. Este ejemplo vino de algunos ejercicios de informática graduada en UPenn. Su respuesta al menos me dijo que este no es un problema simple de resolver. Gracias. – octopusgrabbus

1

Eche un vistazo a la fuente de clojure.walk. Es una biblioteca para hacer operaciones (en bloque) en todas las estructuras de datos anidadas de Clojure (sin incluir los mapas ordenados). Hay un código de aspecto muy poderoso pero engañosamente simple, que usa la recursión a través de funciones anónimas definidas localmente sin utilizar loop/recur.

La mayoría de las funciones están basadas en las funciones de paso de peatones y pre-paseo, que a su vez se basan en la función de caminar. Con la fuente y (forma de demostración previa) y (formulario de demo posterior) puede obtener una buena idea de los pasos recursivos realizados.

No sé si esto podría ayudarte a resolver tu problema. Actualmente estoy tratando de hacer algo en el mismo dominio de problemas: crear una función para "aplanar" mapas y vectores anidados en una secuencia de todas las rutas de raíz a hoja, cada ruta una secuencia de claves y/o índices que terminan en ' valor de la hoja

Esta biblioteca parece hacer que los valores de edición recursivamente en toda la estructura sean bastante simples. Sin embargo, todavía no tengo idea de cómo usarlo para mantener un seguimiento funcional de los datos acumulados entre iteraciones que son necesarias para mis 'rutas' y probablemente también para su problema 'esqueleto'.