[ Foro de Pascal ]

Averiguar un procedimiento

13-Dec-2010 12:32
Emanuel Bazan
2 Respuestas

Hola Nacho y Antonio!!!
Gracias a Ustedes tengo un poco más de animo para rendir esta materia el viernes, comencé a mirar algunos ejercicios y no entiendo el siguiente:

Luego de de?nir el tipo de variable arreglo como un arreglo de 200 enteros,
a) describir qu´e realiza el siguiente procedimiento.

procedure  averiguar(a:arreglo;lb,ub,valor:integer);
var  m:integer;
begin
  if  (lb>ub)  then  writeln(’no’)
  else  m=(lb+up)  div  2;
  if  (valor=a[m])  then  writeln(m)
  else  if  (valor  <=  a[m])  then  averiguar(a,lb,m-1,valor)
       else  averiguar(a,m+1,ub,valor)
end.
b) Escribir un procedimiento no  recursivo que realice exactamente lo mismo que el procedimiento
averiguar.


Lo que no alcanzo a comprender es cómo se yo que valores representan: lb, ub y valor.
Para mi el profesor en el examen se equivoco al poner up debía decir ub...
Cualquier sugerencia, apunte para completar son muy bien recibidas. Saludos


14-Dec-2010 00:25
Nacho Cabanes (+83)

Fíjate en lo que hace el procedimiento, no en los nombres de las variables:

- Divides el array en dos mitades.

- Miras el valor central.

- Si el valor que buscas es menor que el valor central, repites la búsqueda dentro de la mitad inferior.

- Si el valor que buscas es mayor que el valor central, repites la búsqueda dentro de la mitad superior.

Se trata de un algoritmo de "búsqueda binaria", una de las formas más rápidas de buscar dentro de un array que sepas que está ordenado.

Yo no soy partidario de usar nombres de variables tan cortos, porque un programa se escribe una sola vez y se lee muchas más (especialmente si eres parte de un grupo de programadores) pero es de suponer que "ub" sea la abreviatura de "upperBound" (límite superior) y que "lb" sea la de "lowerBound" (límite inferior), que son los dos extremos entre los que intentas encontrar ese valor.


14-Dec-2010 12:37
Emanuel Bazan

Gracias !!!!
Ya me quedan menos dudas, se entendió perfectamente tu explicación. Muy amable, estoy muy nervioso(dentro de 48 hs rindo) no sabes lo que aprecio tu colaboración después de un año tan duro. Saludos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)