Programa recursivo para obter raiz quadrada
Publicado por Mateus Moutinho (última atualização em 19/02/2020)
[ Hits: 4.153 ]
Programa que obtém a raiz quadrada de um número via aproximação recursiva, o código não possui NENHUMA variável e é 100 por cento funcional,
então é ótimo pra quem quer aprender programação funcional ou recursividade. Fique a vontade para testar, modificar ou usar em seus programas.
Construí o código porque estou montando um software gráfico totalmente recursivo e não queria sujar o programa com algum loop ou ter que usar a math.h.
#include <stdio.h>
#define CONTADOR 16
// Essa função retorna um número aproximado do resultado
const int retorna_contador_de_potencia (const double *vetor_de_potencia, const double numero, int contador_de_potencia){
if (vetor_de_potencia [contador_de_potencia] >= numero/10){
--contador_de_potencia;
contador_de_potencia = retorna_contador_de_potencia(vetor_de_potencia,numero,contador_de_potencia);}
return (contador_de_potencia);
}
// essa aproxima o resultado em sentido positivo
const double retorna_resultado_positivo (const double *vetor_de_potencia, const double numero, double resultado_positivo, int contador_de_potencia){
if (resultado_positivo * resultado_positivo >= numero ){return (resultado_positivo);}
resultado_positivo = resultado_positivo + vetor_de_potencia[contador_de_potencia];
resultado_positivo = retorna_resultado_positivo(vetor_de_potencia, numero, resultado_positivo, contador_de_potencia);
}
// essa aproxima o resultado em sentido negativo
const double retorna_resultado_negativo (const double *vetor_de_potencia, const double numero, double resultado_negativo, int contador_de_potencia){
if (resultado_negativo * resultado_negativo <= numero ){return (resultado_negativo);}
resultado_negativo = resultado_negativo - vetor_de_potencia[contador_de_potencia];
resultado_negativo = retorna_resultado_negativo(vetor_de_potencia, numero, resultado_negativo, contador_de_potencia);
}
/* essa é a função mais importante ela acha o resultado
através de um decremento no contador a cada ciclo que se passa */
const double recursao_que_obtem_resultado(const double *vetor_de_potencia, const double numero, double resultado, int contador_de_potencia){
resultado = retorna_resultado_positivo(vetor_de_potencia, numero, resultado, contador_de_potencia);
--contador_de_potencia; //|Acontece o decremento do contador
resultado = retorna_resultado_negativo(vetor_de_potencia, numero, resultado, contador_de_potencia);
switch (contador_de_potencia) {
case 0:
return (resultado);
break;
default:
resultado = recursao_que_obtem_resultado(vetor_de_potencia, numero, resultado, contador_de_potencia );
break;
}
}
// função só pra capturar o número e não precisar sujar o código com variáveis
const double captura_numero(void){
double numero;
scanf("%lf",&numero);
return (numero);
}
int main (void){
//| Esse é o vetor para obter os cálculos de aproximação
const double vetor_de_potencia [] ={
0.00000001, //|0
0.000001, //|1
0.00001, //|2
0.0001, //|3
0.001, //|4
0.01, //|5
0.1, //|6
1, //|7
10, //|8
100, //|9
1000, //|10
10000, //|11
100000, //|12
1000000, //|13
10000000, //|14
100000000, //|15
1000000000, //|16
};
//---------------------------Strings de pergunda (nada demais)------------------------------------------
const char *pergunta_inicial ="Por favor digite um número";
const char *declaracao_de_resultado ="A raiz quadrada é = ";
const char *pergunta_de_loop ="deseja fazer outro cálculo (s) para sim e (n) para não";
//---------------------------Captura do número inicial---------------------------------------------------
printf("%s\n",pergunta_inicial);
const double numero =captura_numero();
//---------------------------Chamando as funções recursivas---------------------------------------------
/* a primeira constante obtem um número aproximado pra facilitar a
aproximação por tentativa e erro */
const int contador_de_potencia = retorna_contador_de_potencia(vetor_de_potencia, numero,CONTADOR);
/* A segunda constante declara o resultado inicial usando o contador de potencia
como referencia para o vetor de potencia */
const double resultado_inicial = vetor_de_potencia[contador_de_potencia];
/* A terceira constante ja é o resultado final , por que ela chama a
recursão que obtem resultado, e a recursão que obtem resultado chama as duas
funções de aproximação */
const double resultado_final =recursao_que_obtem_resultado(vetor_de_potencia, numero, resultado_inicial, contador_de_potencia);
//-----------------------------Printa os resultados e pergunta se quer voltar (nada demais)----------
printf("%s%lf\n", declaracao_de_resultado,resultado_final);
printf("%s\n",pergunta_de_loop);
getchar(); //| limpeza no buffer
const char resposta = getchar();
//| swtich que chama a main novamente se a resposta for (s)
switch (resposta) {
case 's' : main(); break;
case 'S' : main(); break;
}
return 0;
}
[GAME-2] Acerte os rortões nas janelas (jogo com gráficos)
Fibbonacci com Memoization - O(n)
Ordenar um lista estática sequencial básica (bubblesort)
Jogo da Velha com IA invencivel
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Warcraft II Remastered no Linux? (1)
Linux é a solução para o fim do Windows10? [RESOLVIDO] (8)
Assinador JNLP do Site Portal da Nota Fiscal Eletrônica (0)









