2009-11-11 24 views
11

Actualmente estoy leyendo el The Craft of Functional Programming de Simon Thompson y cuando describo la recursión, también menciona una forma de recursión llamada Recursividad primitiva.¿Cómo difiere la recursión primitiva de la recursividad "normal"?

¿Puede explicar cómo este tipo de recursión es diferente de las funciones recursivas "normales"?

Aquí está un ejemplo de una función de recursión primitiva (en Haskell):

power2 n 
    | n == 0 = 1 
    | n > 0  = 2 * power2(n - 1) 

Respuesta

8

Una respuesta simplificada es que las funciones recursivas primitivas son aquellas que se definen en términos de otras funciones recursivas primitivas, y la recursión en la estructura de los números naturales. Los números naturales son conceptualmente como esto:

data Nat 
    = Zero 
    | Succ Nat -- Succ is short for 'successor of', i.e. n+1 

Esto significa que puede recursivo en ellos de esta manera:

f Zero  = ... 
f (Succ n) = ... 

Podemos escribir tu ejemplo como:

power2 Zero = Succ Zero -- (Succ 0) == 1 
power2 (Succ n) = 2 * power2 n -- this is allowed because (*) is primitive recursive as well 

Composición de funciones recursivas primitivas también es primitivo recursivo.

Otro ejemplo es los números de Fibonacci:

fib    Zero = Zero 
fib   (Succ Zero) = (Succ Zero) 
fib (Succ [email protected](Succ n' )) = fib n + fib n' -- addition is primitive recursive 
-3
+0

... muy útil -_- –

+2

¿Preferirías copiar y pegar algunas secciones? Si hay algún aspecto de la recursión primitiva que no comprende, se puede proporcionar una mejor respuesta, pero "¿cómo difiere de la recursión general?" Se puede responder meramente mirando la definición en Wikipedia. –

+5

El OP intenta aprender algo aquí. ¿Dirías a tus alumnos a una enciclopedia si fueras profesor de matemáticas? –

7

funciones recursivas primitivos son una respuesta natural (de matemático) para el problema de la parada, al eliminar el poder de hacer auto-recursión ilimitada arbitraria.

Considérese una función de "mal"

f n 
    | n is an odd perfect number = true 
    | otherwise = f n+2 

¿Se terminan f? No puedes saber sin resolver el problema abierto de si hay números perfectos impares. Es la capacidad de crear funciones como estas lo que dificulta el problema de detención.

La recursión primitiva como construcción no le permite hacer eso; el punto es prohibir la cosa "f n + 2" sin dejar de ser lo más flexible posible - no se puede definir primitiva-recursivamente f (n) en términos de f (n + 1).

Tenga en cuenta que el hecho de que una función no sea primitiva recursiva no significa que no termina; La función de Ackermann es el ejemplo canónico.

+0

Y entonces, ¿cuál es la diferencia entre la recursión bien fundada y la recursión primitiva? – Hibou57

2

las funciones recursivas que sólo pueden ser implementadas por hacer bucles son funciones recursivas primitivas.

+1

Solo FYI (basado en su otra publicación, no esta), puede publicar un CV en http://careers.stackoverflow.com/ –

+0

Realice bucles con la variable de bucle estrictamente decreciente. – ARi

Cuestiones relacionadas