Created
January 24, 2011 17:50
-
-
Save robotlolita/793600 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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