Mi, qué nido de sutiles distinciones terminológicas. Que es esto"?
fib=0:1:zipWith (+) fib (tail fib)
No es una función recursiva. No es datos recursivos. Es una definición recursiva.
¿Qué se está definiendo?
fib
¿Qué tipo de cosa es fib
, de acuerdo con esta definición?
[Integer]
Una lista de enteros (o tal vez una lista de cualquier elemento numérico antiguo).
¿Es fib
una función? No, es una lista. ¿Está fib
recursivamente definido? Sí. ¿Se definiría recursivamente fib
si reemplazamos zipWith
por una función no recursiva del mismo tipo (por ejemplo, \ f xs ys -> xs
)? Sí, aunque sería una lista diferente definida recursivamente.
¿fib
es una lista cíclica? No. ¿La "estructura de datos recursiva" significa "estructura de datos cíclica"? No según el documento de Hoare, "Estructuras de datos recursivas": http://portal.acm.org/book_gateway.cfm?id=63445&type=pdf&bookpath=%2F70000%2F63445%2Fcb-p217-hoare.pdf&coll=&dl=&CFID=15151515&CFTOKEN=6184618
En una configuración tipeada, "estructura de datos recursiva" significa no más ni menos que "habitante de un tipo definido recursivamente". De manera correspondiente, "fred"
es una estructura de datos recursiva, aunque no se define recursivamente, y de hecho puede actuar sobre ella mediante funciones recursivas tales como ++
.
La frase "función recursiva" significa "función definida recursivamente". La frase "valor recursivo" significa "valor definido recursivamente", como existe en idiomas no limitados: los lenguajes estrictos tienen el problema de "recursión de valor".
Y si usted piensa que es pedante, tratar de definir fib
de esa manera en un total idioma programación , y descubrirá que la noción de "definición recursiva" se divide en "definición por recursión estructural" (consumo de datos en una manera que se detiene) y "definición por corecursion guardado" (produciendo datos de una manera que va), y que fib
es de la última variedad. En ese contexto, la productividad de fib
depende crucialmente de la pereza de zipWith
. En el entorno de Haskell, por supuesto, no necesita preocuparse por nada de eso para descubrir qué tipo de definición es algo, solo para descubrir si tiene la mitad de posibilidades de funcionar realmente.
printf "¡Oh, no, una función con cero argumentos, no podemos tener eso!" o morir; –
Un 'fib' de hecho. – Ani
'zipWith' es la función recursiva, y' fib' se refiere a su resultado. No hay nada mágico o no recursivo al respecto. (Las respuestas a continuación que afirman que "no hay función" son tan confusas como su compañero de trabajo.) –