Hola,
Cita:
Iniciado por ec89 ... es mas si la recursion esta bien hecha es imposible que un ciclo sea mas eficiente, ...
¿What?
Ya GreenEyed lo demostró, y pyanqn lo explicó.
(Ahora que después de eso hay varias 'barbaridades').
Un algoritmo que usa recursividad va a ser mucho menos eficiente que un algoritmo secuencial.
Y
cualquier algoritmo que usa recursividad es puede reescribir en forma secuencial.
¿Por qué? - Cuando el compilador genera una llamada a una función (cualquiera que sea), realiza muchas actividades que el programador no 'mira'.
- Cuando el lenguaje está orientado a objetos la llamada a la función es 'inclusive' mucho mas compleja que un lenguaje procedural.
- No importa si lo llama N, N+1, N+1000 veces, cada ciclo consume muchos mas recursos que un ciclo normal 'for', 'while', etc.
- Una vez el código recursivo y secuencial estén bien escritos.
Cuando escribimos una llamada a una función así :
MyObjeto.funcion();
El compilador hace miles de cosas diferentes 'que no miramos'; para saber que 'instancia' de la clase MyObjeto está llamando la función, prepara un area de memoria para almacenar los datos específicos del objeto, revisa si el método no está overloaded, pasa un parámetro 'this' oculto, revisa la sincronización, si el objeto está sincronizado el monitor revisa si fué adquirido o reentrado, etc.
Al final son demasiadas instrucciones
invisibles. Cosas que el programador no tiene control porque son parte del compilador.
- Para comprender a profundidad el concepto tendrias que conocer como funciona el compilador de Java, y el bytecode que genera.
- Cada llamada a una función genera una instrucción 'invokevirtual'.
Lee la información de
invokevirtual en :
http://java.sun.com/docs/books/jvms/...ons2.doc6.html
Saludos,
Por aparte ...
- Como ejercicio podrías buscar el código fuente de un compilador C++ que esté escrito en C (no un programa escrito en C++ sino el código fuente del compilador), y mira la cantidad de procedimientos que requiere una simple y sencilla llamada a una función.
- Y eso no significa que los lenguajes como C o Pascal, no tengan esta situación, una llamada a una función en C genera muchas instrucciónes en Assembler que consumen muchos ciclos de CPU.
Por qué es importante conocer el bytecode?.
http://www.ibm.com/developerworks/ib...ggar_bytecode/