La idea de búsqueda binaria es dividir una sucesión e ir tomando en consideración porciones cada vez más reducidas (habitualmente dividiendo la sucesión por la mitad), hasta encontrar el elemento buscado.
Pongo mi propuesta, que consiste literalmente en ir buscando aproximaciones sucesivas al valor del radicando, a partir de dos valores iniciales, un límite inferior y otro superior. Estos dos límites pueden ser las raíces enteras próximas a la buscada o cualquier otro valor; la condición es que el primero sea menor y el segundo mayor a la raíz buscada. La serie converge sin demasiada excitación, pero firme.
Aunque esta solución no es muy eficiente, es la que para mí responde con más justeza a los términos del problema.
Código C++:
Ver original#include <iostream>
#include <cmath>
#include <iomanip>
// cálculo de raiz cuadrada como búsqueda binaria
double raiz(double n ,double inf ,double sup)
{
static const double epsilon = 1E-6; // razonablemente 0
// (se puede pedir al usuario)
double m = (inf+sup)/2; // promedio de los límites
double delta
= std
::fabs(m
*m
- n
); // aproximación al radicando
if (delta <= epsilon) // el promedio es la raiz
return m;
if(m*m < n) // promedio menor que la raiz
return raiz(n, m, sup); // buscar entre el promedio y sup
// promedio mayor que la raiz
return raiz(n, inf, m); // busca entre inf y el promedio
}
int main()
{
double raiz_7 = raiz(7, 2, 3); // la raiz de 7 se supone entre 2 y 3
std::cout << std::setprecision(6) << std::fixed;
std::cout << "raiz cuadrada de 7 = " << raiz_7 << '\n';
}
Por otro lado, sé que no tiene nada que ver con un problema escolar, pero como una especie de respeto básico, no habría que llamar "método de Babilonia" a la fórmula de Herón de Alejandría...