Fazendo Divisão usando recursividade

6 respostas
tRuNkSnEt

Aew galera !!!

Cheguei num empasse … consegui depois de muito tempo pensando fazer a recursiva de uma divisão infelizmente consegui apenas com numeros interios. Exemplo:
a = 10
b = 3
Resultado da divisao de a por b é: 3 com resto 1 (veja estou trabalhando com interios)

Agora quero a recursiva de numeros reais : Exemplo
a = 10
b = 3
Resultado devera ser 3,33333:E (Observaçao … do jeito convencional eu consegui fazer galera …e muito facil do jeito normal … eu quero é usando recursivadade … bah!!!)
Bom esse desafio eu quero ver huhuhuhu e muito legal programar recursivamente. Um codigo de linha que geralmente gasta de 20 a 10 linha vc faz no maximo com 4 linhas … problema e o gasto de memoria do caralho huhuhuhu … quem programa em J2ME nao pode nem pensar nisso !!!

Boa programação espero respostas !!!


“Ele nao sabia que era impossivel foi lá e fez!!!” :roll: :roll: :roll: :slight_smile: :stuck_out_tongue:

6 Respostas

cv1

Trunks, poste aqui o teu codigo, que faz a divisao recursiva de inteiros, assim pelo menos a gente tem uma base :wink:

maxguzenski

cara, eu realmente nao entendi aonde entra a recursividade com apenas 2 numeros ?

louds

Esse código funciona com números positivos apenas, mas é simples arrumar p/ funcionar com negativos tb. Funciona com reais se quiser.

class Resultado {
 int res, mod;
  Resultado(int a, int b) {
      res = a; mod = b;
  }
}

  Resultado div(int a, int b) {
   Resultado res = new Resultado(0, 0);
   rec_div(a, b, res);
   return res;
 }

  void rec_div(int a, int b, Resultado res) {
    if(a < b) res.mod = a; 
    else { ++res.res; rec_div(a - b, b, res);
  }
tRuNkSnEt
Aew galera seguinte para quem nao entendeu o treco da divisão usando recursividade olha esse codigo que eu fiz: :arrow:

//-------Divisão entre 2 num ----------

public static String divisao (int a, int b, int i){

if (a<b)

return "O resultado da divisão é: " + i + " e o resto é: " + a;

else

return divisao (a-b,b,i+1);

}

Veja 4 linhas.

exemplo:

a = 10

b = 3

Resultado = O resultado da divisão é: 3 e o resto é : 1 (como trabalho com inteiros c eu dividir 10 por 3 o resultado e 3 com resto 1 (prova 3*3=9 + 1 = 10 ok resultado confere) so que na verdade 10/3 = 3,33333 ou seja tenho de trabalhar com reais nao inteiros  o problema e que nao consigo resolver o a recursividade usando numeros reais  para dar o resultado 3,333.

Ok galera espero que quem nao entendeu tenha melhorado tudo que eu posso dizer ta no codigo assim olhe analise leia , leia denovo e tente voce tambem (especie de desafio  :roll: )

Quando chegar em casa vou testar o codigo do [color=“red”]louds[/color] pra ver c funfa c funfar eu digo!!!

Boa programaçao heheh otimo desafio huhuhu!!!

tenho outros codigo usando recursividade tipo soma de numeros de uma pa , de um pg, reversa de uma string … boa que tal fazer tambem uma recursiva para descobrir se uma string e palindroma ou nao bah…boa sorte!!!


“Agora sou alpinista so as alturas me interresa!” :shock:

F

Bom, eu andei pensando um poco e cheguei na seguinte solucao, mas nao teve como fugir de usar multiplicacao…

ai vai o codigo:

public class Div
&#123;
	public static final double SMALL = 0.0001;

	public static double div&#40;double a, double b, double decimal&#41;&#123;
	
		if&#40;a &lt; SMALL || decimal &lt; SMALL&#41; return 0;
		else if&#40;a &lt; b&#41; return div&#40;a, b*0.1, decimal*0.1&#41;;
		else return &#40; decimal + div&#40;a-b, b, decimal&#41; &#41;;
	
	&#125;

	public static void main&#40;String &#91;&#93; args&#41; throws Exception&#123;
	
		double a = Double.parseDouble&#40;args&#91;0&#93;&#41;;
		double b = Double.parseDouble&#40;args&#91;1&#93;&#41;;	
		double c = div&#40;a,b,1&#41;;
		System.out.println&#40;c&#41;;
	&#125;
&#125;
louds

O algoritmo que eu e o tRuNkSnEt mostramos, são equivalentes, faz direito divisão de naturais e pode ser utilizado para divisão de reais positvos também.

Para fazer ela funcionar com números negativos é 1 pouco mais trabalhoso:

class Resultado &#123; 
int res, mod; 
  Resultado&#40;int a, int b&#41; &#123; 
      res = a; mod = b; 
  &#125; 
&#125; 

  Resultado div&#40;int a, int b&#41; &#123; 
   Resultado res = new Resultado&#40;0, 0&#41;; 
   rec_div&#40;a, b, res&#41;; 
   if&#40;&#40;&#40;a &amp; &#40;1 &lt;&lt; 31&#41; &#41; ^ &#40;b &amp; &#40;1 &lt;&lt; 31&#41;&#41;&#41; != 0&#41; //1 pouco de mágica
      res.res = -res.res;
   return res; 
&#125; 

  void rec_div&#40;int a, int b, Resultado res&#41; &#123; 
    if&#40;Math.abs&#40;a&#41; &lt; Math.abs&#40;b&#41;&#41; //comparamos por módulo
          res.mod = a; 
    else &#123; ++res.res; rec_div&#40;a - b, b, res&#41;; 
  &#125;

Para fazer isso funcionar com números reais é só trocar o teste ‘1 pouco de mágica’ pelo equivalente para ponto fluturante (xor dos sinais).

Existem outros algoritmos para fazermos divisão, como os da classe radix-n SRT, com n = [1,2,4,8,…[. BTW, radix-4 SRT era o algoritmo de divisão bugado dos pentium, alguem lembra disso? Tem também a classe de algoritmos para divisão que o Kantabutra criou, que são bem mais simples que os de SRT por não exigir tabelas enormes e serem mais faceis de compeender.

Criado 22 de agosto de 2003
Ultima resposta 22 de ago. de 2003
Respostas 6
Participantes 5