2010-05-06 17 views
7

Una pregunta teórica aquí sobre la base o caso de detención en un método recursivo, ¿cuáles son sus estándares?Caso base en un método recursivo

Es decir, ¿es normal no tener cuerpo, solo una declaración ?

¿Siempre es así:

if (input operation value) 
    return sth; 

¿Tiene diferentes pensamientos sobre él?

Respuesta

1

El caso base es terminar el ciclo (evitar convertirse en una recursión infinita). No hay un estándar en el caso base, cualquier entrada que sea lo suficientemente simple para ser resuelta exactamente puede ser elegida como una sola.

Por ejemplo, esto es perfectamente válido:

int factorial (int n) { 
    if (n <= 5) { 
    // Not just a return statement 
    int x = 1; 
    while (n > 0) { 
     x *= n; 
     -- n; 
    } 
    return x; 
    } else { 
    return n * factorial(n-1); 
    } 
} 
+1

Dije que estoy haciendo una pregunta teórica, quiero decir, si quiero enseñar recursividad, no usaré su código anterior, sé que es una manera válida, pero no hace recursividad y el concepto de caso base está claro suficiente, ¿qué piensas? – Lisa

7

El patrón para funciones recursivas es que se ven algo como esto:

f(value) 
    if (test value) 
     return value 
    else 
     return f(simplify value) 

No creo que se puede decir mucho más de lo eso sobre casos generales.

+1

¿Qué lenguaje de programación es ese? – Solace

+4

@Solace Parece más un pseudocódigo, no un lenguaje de programación particular – Deep

0

Depende enteramente de la función recursiva particular. En general, no puede ser una declaración return; vacía, sin embargo, para cualquier función recursiva que devuelve un valor, el caso base también debe devolver un valor de ese tipo, ya que func(base) también es una llamada perfectamente válida. Por ejemplo, una función recursiva factorial devolvería un 1 como valor base.

+0

Sin embargo, un método recursivo no tiene por qué devolver un valor. – Ken

+0

Cierto, por supuesto. Pero entonces, podría decir: para los métodos recursivos que devuelven 'void', la base también devolverá' void' ...;) – tzaman

1

En algunos casos, su caso base es

return literal 

En algunos casos, su caso base no es simplemente "volver un literal".

No puede haber un "estándar", depende de su función.

La "Función de Syracuse" http://en.wikipedia.org/wiki/Collatz_conjecture por ejemplo, no tiene un caso base trivial o un valor literal trivial.

"¿Tiene diferentes opiniones al respecto?" No es realmente una pregunta sensata.

La recursión tiene que terminar, eso es todo. Una recursividad de cola trivial puede tener un "caso base" que devuelve un literal, o puede ser un cálculo. Una recursión más compleja puede no tener un "caso base" trivial.

+0

Tratando de construir más sobre esta respuesta, un caso base en una función recursiva también podría ser algo cuyo 'O (n)' es sustancialmente más bajo que el 'O (n)' de la función real. Por lo tanto, devolver una operación más simple (menos compleja). – Deep

Cuestiones relacionadas