Algoritmo?

8 respostas
J

Buenas GUJeiros.

Então to com um execicio aqui faz alguns dias e não
consigo fazer, vou postar o enunciado do exercicio e
o codigo que eu fiz, o codigo ta compilando perfeitamente
mais o resultado não esta de acordo com o sugerido…no
exercicio… se puderem me ajudar agradeço…

EXERCICIO::

[b]Elabore uma função recursiva que retorne o valor do somatorio da seguinte série, dado
como parametro de entrada um valor qualque inteiro n, onde (n>=1): OBS: esse somátorio
tende a 0,367…

1/1 - 2/2 + 3/6 - 4/24+ 5/120 …n/n![/b]

CÓDIGO::

program Chegando1;

{$APPTYPE CONSOLE}

uses SysUtils;
   {***********Variaveis Escopo Global*************}

var 
    numero: integer;

     {*********Incio Função Fatorial*******}
function fatorial (y: integer): real;


  begin
      if y=0 then
         fatorial := 1
      else

         begin
         fatorial:= y * fatorial (y-1);
         end;  
  end;

  
function calculo (x:integer): real;
var finalA, finalB, finalTotal,  calcA, calcB, trans: real;
    cont: integer;
  begin
  finalA:=0;
  finalB:=0;
  trans:=0;
      for cont:=1 to x do
         if (cont mod 2)= 0 then
             begin
                calcA := cont/(cont* fatorial(cont));
                finalA:= finalA + calcA;
                trans:= finalA * (-1);

             end
         else
             begin
                calcB := cont/(cont* fatorial(cont));
                finalB:= finalB + calcB;
             end;
                begin
                   finalTotal:= trans+ finalB;
                   calculo:= finalTotal;
                 end;

  end;

begin
  writeln ('Informe um numero..: ');
  readln (numero);
  writeln (calculo(numero):0:2);
  readln;
end.

Desde ja Agradeço…

8 Respostas

E

Veja onde você errou, comparando o meu programa com o seu.
Dica: nunca tente fazer tudo em uma única rotina. Acho que foi por isso que o resultado não deu certo.

class Somatorio {
    public static double fatorial (int n) {
        
if (n < 0) throw new IllegalArgumentException ("Nao pode obter o fatorial de um numero negativo");
        if (n > 170) throw new IllegalArgumentException ("O fatorial de " + n + " excede Double.MAX_DOUBLE");
        if (n == 0 || n == 1) return 1;
        else return n * fatorial (n - 1);

    }
    public static double funcao (int n) {
        if (n % 2 == 1) return n / fatorial (n);
        else            return - n / fatorial (n);
    }
    public static double somatoria (int n) {
        double resultado = 0;
        for (int i = n; i >= 1; --i) {
            resultado = resultado + funcao (i);
        }    
        return resultado;
    }
    public static void main (String[] args) {
        System.out.printf ("O resultado da somatoria ate %d eh %.10f %n", 150, somatoria (150));
    }
}
E

Hum… na verdade dá a impressão que o que o professor queria não é do jeito que eu ou você fizemos. Vou postar daqui a pouco o que acho que seu professor queria.

B

Tô pensando como um professor passa exercício de função recursiva sem condição de parada.

Só se você implementar algo baseado numa precisão mínima, ele para quando o módulo da diferença entre o cálculo atual e o anterior for menor que a 10 elevado a -X, X sendo a precisão.

J

Eae Galera, ta meio complicado o exercicio nhé…

J

GUJeiros, o que voces acham, esse exercicio tem com ser resolvido? ele tem alguma lógica??? pq vi que bastante gente ta com dificuldade de entende-lo…

valeu…

gomesrod

Não analisei a fundo o código para saber se o resultado está mesmo errado, mas acho que tem uma diferença em relação ao que foi pedido no enunciado:

Você deveria fazer todo o cálculo usando recursividade, e não apenas calcular o fatorial recursivamente e depois fazer loop para as divisões e o somatório.

[EDIT] Não sei se você deve levar a sério o que eu acabei de dizer… depois de muito pensar, desconfio que essa função não seja recursiva.

O
public double somatorio(int n) {
      return somatorio(n, fatorial(n));
   }

   private double somatorio(int n, double fat) {
      if (n == 1)
         return 1;
      
      double soma = n / fat;
      if (n % 2 == 0)
         soma = -soma;
      
      return soma + somatorio(n - 1, fat / n);
   }
Desse jeito só precisa calcular o fatorial uma vez.
manu_treta

cara q coisa d loko quase pirei quando li…

Criado 7 de setembro de 2009
Ultima resposta 8 de set. de 2009
Respostas 8
Participantes 6