[C con Clase] Dado recursivo (era Re: Resumen de Cconclase, Vol 80, Envío 17)

Salvador Pozo salvador en conclase.net
Lun Ene 21 11:36:08 CET 2013


El pasado 2013-01-21 08:19:07, Borja escribió:
 
B> Hola a todos y enhorabuena por el curso!
B> Una pregunta más sobre el dado.
B> Si quisiera crear una función que pudiese simular el lanzamiento de más de
B> un dado y los sumase (o sea, tenemos una función dado(n) donde n es el
B> número de dados tirado), ¿sería adecuado usar la recursividad o es
B> preferible emplear un bucle?. La función quedaría más o menos así:

Hola:

En general, la respuesta a este tipo de dudas es casi siempre elegir el algoritmo más claro. En este caso, dado que sabes exactamente cuantas tiradas de datos necesitas, parece más simple un algoritmo iterativo.

Los algoritmos recursivos suelen ser preferibles cuando el la solución está expresada en función de si misma. Aunque incluso en esos casos hay que analizar si los beneficios (en claridad) compensan las desventajas (recursos).

En este caso concreto, parece que el algoritmo es claramente iterativo, sobre todo teniendo en cuenta que lo que usas como parámetro en el algoritmo recursivo es un contador (claramente un parámetro que indica iteraciones).

Pero si de todos modos quieres valorar la posibilidad de usar un algoritmo recursivo, debes plantearlo en términos que puedas medir: tiempo de ejecución y memoria consumida.

En tu caso concreto, el tiempo lo puedes medir comparando el tiempo que requiere usar una u otra versión un número grande de veces (tanto más grande cuanto más corta sea la función). Digamos mil, cinco mil o diez mil veces. Cuanto menos tiempo requiera, tanto mejor será el código, al menos en términos de velocidad.

La memoria consumida es más complicada de medir, aunque en este caso la diferencia será mayor cuantas más veces tengas que tirar el dado. Las funciones recursivas consumen más memoria en cada llamada, ya que deben almacenar en la pila los valores internos antes de la siguiente llamada. El algoritmo iterativo consume una cantidad fija de memoria, independientemente del número de iteraciones.

Como usas un entero como valor de retorno, el valor máximo, en el peor de los casos (que siempre salga 6), para las iteraciones es de 333333. El algoritmo recursivo con ese valor requerirá mucha memoria, aunque es dudoso que se use en ese caso. Y de todas formas, la memoria de pila se agotará mucho antes, salvo que indiques un tamaño mayor al tamaño por defecto al compilar el programa.

Esos son los criterios normales para elegir uno u otro algoritmo:
- Claridad de código.
- Tiempo de ejecución.
- Uso de recursos.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase