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