Error común de programación 15.1

Si omitimos el caso base o escribimos el paso recursivo en forma incorrecta, de manera que no converja en el caso base, 
se puede producir un error lógico conocido como 

recursividad infi nita

, en donde se realizan llamadas recursivas 

en forma continua, hasta que se agota la memoria. Este error es análogo al problema de un ciclo infi nito en una 
solución iterativa (sin recursividad).

El método 

mostrarFactoriales

 (líneas 16 a 21) muestra los factoriales del 0 al 10. La llamada al método 

factorial

 ocurre en la línea 20. Este método recibe un parámetro de tipo 

long

 y devuelve un resultado de tipo 

long

. La fi gura 15.4 prueba nuestros métodos 

factorial

 y 

mostrarFactoriales

, llamando a 

mostrarFacto-

riales

 (línea 10). Los resultados de la fi gura 15.4 muestra que los valores de los factoriales crecen rápidamen-

te. Utilizamos el tipo 

long

 (que puede representar enteros relativamente grandes) para que el programa pueda

calcular factoriales mayores que 12!. Por desgracia, el método 

factorial

 produce valores grandes con tanta 

rapidez que los valores de los factoriales exceden pronto al valor máximo que puede almacenarse, incluso en
una variable 

long

.

Debido a las limitaciones de los tipos integrales, tal vez se necesiten variables 

float

 o 

double

 para calcular fac-

toriales o números grandes. Esto apunta a una debilidad en la mayoría de los lenguajes de programación: a saber, 
que los lenguajes no se extienden fácilmente para manejar los requerimientos únicos de una aplicación. Como 
vimos en el capítulo 9, Java es un lenguaje extensible que nos permite crear números arbitrariamente grandes, si 
lo deseamos. De hecho, el paquete 

java.math

 cuenta con las clases 

BigInteger

 y 

BigDecimal

 explícitamente 

para los cálculos matemáticos de precisión arbitraria, que no pueden llevarse a cabo con los tipos primitivos.
Para obtener más información acerca de estas clases, visite 

java.sun.com/javase/6/docs/api/java/math/

BigInteger.html

 y 

java.sun.com/javase/6/docs/api/java/math/BigDecimal.html

, respectivamente.

1

// Fig. 15.3: CalculoFactorial.java

2

// Método factorial recursivo.

3
4

 public 

class

 CalculoFactorial

5

{

6

// declaración recursiva del método factorial

7

  public 

long

 factorial( 

long

 numero )

8

{

9

   if

 ( numero <= 

1

 ) 

// evalúa el caso base

10

    return

1

;

// casos base: 0! = 1 y 1! = 1

11

   else

// paso recursivo

12

    return

 numero * factorial( numero -

 1

 );

13

}

// fin del método factorial

14
15

// imprime factoriales para los valores del 0 al 10

16

  public 

void

 mostrarFactoriales()

17

{

18

  

 

// calcula los factoriales del 0 al 10

19

   for

 ( 

int

 contador = 

0

; contador <= 

10

; contador++ )

 20  

 

 

System.out.printf(

"%d! = %d\n"

, contador, factorial( contador ) );

21

}

 // fin del método mostrarFactoriales

22

}

 // fin de la clase CalculoFactorial

Figura 15.3

  |  Cálculos de factoriales con un método recursivo.

Figura 15.4

  |  Prueba del método

factorial

. (Parte 1 de 2).

1

// Fig. 15.4: PruebaFactorial.java

 2

// Prueba del método recursivo factorial.

 3

4

 public 

class

 PruebaFactorial

15.3 Ejemplo de uso de recursividad: factoriales 

657

15_MAQ_CAP_15_DEITEL.indd657

4/19/081:28:58AM