Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: h0oke en 27 Marzo 2010, 15:57 PM

Título: Python - Duda Algoritmo
Publicado por: h0oke 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(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.
Título: Re: Python - Duda Algoritmo
Publicado por: leogtz en 27 Marzo 2010, 23:23 PM
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.
Título: Re: Python - Duda Algoritmo
Publicado por: h0oke en 28 Marzo 2010, 04:45 AM
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)
Título: Re: Python - Duda Algoritmo
Publicado por: Novlucker en 29 Marzo 2010, 02:20 AM
Aún no entiendo la lógica del algoritmo :xD .. es decir, la finalidad :-\

Saludos
Título: Re: Python - Duda Algoritmo
Publicado por: leogtz en 29 Marzo 2010, 19:20 PM
Se supone que para calcular una raíz cuadrada.

¿Cómo se llama el algoritmo?
Título: Re: Python - Duda Algoritmo
Publicado por: Masita en 29 Marzo 2010, 20:19 PM
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)
Título: Re: Python - Duda Algoritmo
Publicado por: gabymar en 29 Marzo 2010, 23:24 PM
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)

Título: Re: Python - Duda Algoritmo
Publicado por: h0oke en 30 Marzo 2010, 03:12 AM
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.