Python - Duda Algoritmo

Iniciado por h0oke, 27 Marzo 2010, 15:57 PM

0 Miembros y 1 Visitante están viendo este tema.

h0oke

Código (python) [Seleccionar]
import math

def menor(a,b):
   return a if(a <= b) else b

def raiz2(a,b):
   c = a//b
   if(math.fabs(b - c) <= 1):
       return menor(b,c)
   else:
       raiz2(a,(b + c)//2)
       
   

a = 170000
b = raiz2(a,3)
print(b)


¿Por qué razón no devuelve el valor que es 412?

PD: Depuré hasta que llega al printf y ahí no hallo el error.

leogtz

Cita de: algorythm en 27 Marzo 2010, 15:57 PM
Código (python) [Seleccionar]
import math

def menor(a,b):
    return a if(a <= b) else b

def raiz2(a,b):
    c = a//b
    if(math.fabs(b - c) <= 1):
        return menor(a,b)
    else:
        raiz2(a,(b + c)//2)
       
   

a = 170000
b = raiz2(a,3)
print(b)


¿Por qué razón no devuelve el valor que es 412?

PD: Depuré hasta que llega al printf y ahí no hallo el error.

¿Qué algoritmo estás usando?
Pon el pseudocódigo del mismo, para ver si alguno que use python te ayuda.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

h0oke

Raiz2(a) = iter(a,3)
donde
       iter(a,x) =
                     sea c = [a/x] {[] = piso}
                     si |x - c| <= 1 contestar min(x,c)
                     sino
                           iter(a,[(x+c)/2]


PD: Modifiqué el menor(a,b) por menor(b,c)

Novlucker

Aún no entiendo la lógica del algoritmo :xD .. es decir, la finalidad :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

leogtz

Se supone que para calcular una raíz cuadrada.

¿Cómo se llama el algoritmo?
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Masita

No entiendo muy bien la logica de tu algoritmo.... De todos modos si lo que quieres es hacer una raiz cuadrada, puedes hacerlo con el modulo math.

math.sqrt(a)
En el cielo estan suspendidas las palabras que cantamos en nuestros sueños....

gabymar

#6
Hola algorithm, parece que la recursividad te da un pequeño problema, la iteracion que encuentre el resultado devolvera con return el valor de la raiz, pero he ahi el problema, ¿ a quien le devuelve el valor?, pues a la iteracion anterior que es la que le llamo, y esta se queda con el valor, pues no hay un retorno hacia atras de este resultado.

   una solucion puede ser esta, si te das cuenta la funcion devuelve None o sea nada si no llegamos a la solucion, entonces cuando la solucion se alcance cada iteracion respondera a la anterior con el valor x.

  modifico, no es necesario comprobar la respuesta de las siguientes iteraciones, puesto que no habra respuesta hasta que el resultado sea el esperado.
   Saludos : Gaby



import math

def menor(a,b):
   return a if(a <= b) else b

def raiz2(a,b):
   c = a//b
   if(math.fabs(b - c) <= 1):
       return menor(b,c)  
   else:
       return raiz2(a,(b + c)//2)




a = 170000
b = raiz2(a,3)
print(b)


h0oke

Muchas gracias gabymar, excelente respuesta...

Con respecto a las dudas anteriores, es simplemente un algoritmo para encontrar la raíz cuadrada de un número por método de bisección utilizando únicamente operaciones de alu.