Skip to content

Instantly share code, notes, and snippets.

@robotlolita
Created January 24, 2011 17:50
Show Gist options
  • Save robotlolita/793600 to your computer and use it in GitHub Desktop.
Save robotlolita/793600 to your computer and use it in GitHub Desktop.
def raiz_quadrada(numero):
"""Retorna a raiz quadrada do número passado como parâmetro.
"""
for chute in chute_uns_numeros(numero):
if chute_esta_bom(chute, numero):
return chute
def chute_esta_bom(chute, numero):
"""Retorna se o chute é uma aproximação boa o suficiente da raiz quadrada.
Uma aproximação é considerada boa o suficiente se a diferença absoluta
entre chute² e o número for menor que 0.000000001.
"""
return abs(chute ** 2 - numero) < 0.1e-8
def chute_uns_numeros(numero_final):
"""Tenta retornar uma raiz aproximada para o número final.
Retorna uma classe iterator (que pode ser usada em for..in loops), que se
encarrega de tentar descobrir qual é a raiz quadrada do número dado. É
interssante usar um iterador porque ele se encaixa bem com o esquema de
aproximações sucessivas do método de Newton.
"""
class Chutes(object):
def __init__(self):
self.chute_atual = 1.0
self.numero_final = numero_final
def __iter__(self):
return self
def next(self):
"""Tenta um chute melhor que o atual.
Para aproximar melhor o chute atual da raiz quadrada real do
número o método de Newton usa uma simples média entre o chute atual
e o fator da divisão do número final pelo chute atual.
"""
fator = self.numero_final / self.chute_atual
self.chute_atual = (self.chute_atual + fator) / 2.0
return self.chute_atual
return Chutes()
###############################################################################
print raiz_quadrada(9)
# Out >> 3.0
print raiz_quadrada(15)
# Out >> 3.87298334621
print raiz_quadrada(128)
# Out >> 11.313708499
print raiz_quadrada(3 ** 9)
# Out >> 140.29615413
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment