06.05.2013 Views

CONTENIDO DE LA LECCIÓN 18

CONTENIDO DE LA LECCIÓN 18

CONTENIDO DE LA LECCIÓN 18

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

MIGUEL Á. TOLEDO MARTÍNEZ<br />

mitad = (primero + ultimo) / 2<br />

[primero] [ultimo]<br />

[primero] [mitad – 1] [mitad + 1] [ultimo]<br />

Figura <strong>18</strong>.4. La búsqueda binaria recursiva requiere que un arreglo sea dividido en mitades con cada llamada recursiva.<br />

Cualquiera de estas condiciones primitivas hará que termine la llamada recursiva. Ahora, vamos a<br />

considerar la primera condición primitiva más de cerca. ¿Cómo saber si el arreglo que se busca tiene<br />

solamente un elemento? Bueno, conforme continúan las llamadas recursivas sin encontrar el elemento,<br />

finalmente el arreglo se reducirá a un elemento sencillo. Si éste es el que se está buscando, la verificación si<br />

A[mitad] == elemento será verdadera, y las llamadas recursivas se detendrán. Si no lo es, el valor de<br />

primero se hará más grande que el valor de ultimo en la siguiente división. ¿Por qué? Porque si piensa en<br />

la acción de división del algoritmo, se dará cuenta que cada llamada recursiva hace que primero se<br />

incremento y ultimo se decremente. De esta manera, si el elemento no está en el arreglo, el valor de<br />

primero se hace finalmente más grande que el valor de ultimo. Por lo tanto se puede usar esta idea para<br />

verificar que el elemento no está en el arreglo, también para usarlo como una condición primitiva. De esta<br />

manera, se reemplazará la condición primitiva original con el siguiente enunciado:<br />

si (primero > ultimo) entonces<br />

regresar – 1<br />

Si ocurre esta condición, se regresa el valor -1, indicando que no se encontró el elemento y terminan las<br />

llamadas recursivas.<br />

Ahora, vamos a aplicar este conocimiento a un segundo nivel del algoritmo. Como sigue:<br />

Algoritmo busquedaBin(): Segundo nivel<br />

busquedaBin(A, elemento, primero, ultimo)<br />

INICIO<br />

si(primero > ultimo) entonces<br />

regresar -1.<br />

sino<br />

Establecer mitad = (primero + ultimo) / 2.<br />

si (A[mitad] == elemento) entonces<br />

regresar mitad.<br />

sino<br />

si (el elemento está en la primera mitad) entonces<br />

busquedaBin(A, elemento, primero, mitad - l)<br />

sino<br />

busquedaBin(A, elemento, mitad + 1, ultimo)<br />

FIN.<br />

Es evidente ahora que el algoritmo realiza la recursividad, porque se puede ver la función llamándose a sí<br />

misma en uno o dos lugares, dependiendo de en qué mitad del arreglo dividido es probable que se encuentre<br />

el elemento. También, observe en dónde se verifican los dos casos primitivos. Si, al inicio de una llamada<br />

recursiva, primero > ultimo, el elemento no está en el arreglo y las llamadas recursivas terminan. Además,<br />

si después de calcular mitad, se encuentra el elemento en A[mitad], terminará la llamada recursiva. En<br />

ambos casos, la función ha terminado su ejecución y regresa un valor al programa llamador. Lo último que<br />

ARREGLOS, APUNTADORES Y ESTRUCTURAS – <strong>LECCIÓN</strong> <strong>18</strong> <strong>18</strong>-54

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!