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.
Cita de: algorythm en 27 Marzo 2010, 15:57 PM
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.
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)
Aún no entiendo la lógica del algoritmo :xD .. es decir, la finalidad :-\
Saludos
Se supone que para calcular una raíz cuadrada.
¿Cómo se llama el algoritmo?
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)
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)
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.