Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

antunesleo_

Problema na construção de algoritmo recursivo

Recommended Posts

Preciso entregar esse exercício recurso até amanhã na faculdade, porém não tenho a miníma ideia de como resolve-lo. O único exercício com recursividade que resolvemos lá foi o fatorial!, apesar de confuso consegui entender o conceito, mas nesse ai abaixo, na hora de construir a lógica da um branco na cabeça. Qualquer ajuda é bem vinda, segue o exercício proposto!

 

 

Fazer uma função recursiva que calcule o valor da série S descrita a seguir para um valor n > 0 a ser fornecido como parâmetro para a mesma nS = 1 + 1/2! + 1/3! + ... 1/n!

OBS: A função fatorial também deve ser recursiva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma função recursiva nada mais é que uma função que chama a si mesma até que determinada condição de parada seja atingida... se você já viu como funciona uma função com fatorial, esta não deveria ser problema de resolver, já que as duas são praticamente idênticas... analisando a sequencia proposta, você verá que sua condição de saída da recursividade é que S = 1, senão a função deve chamar a sí própria passando S-1 como parâmetro até que S=1. Basicamente, o algoritmo seria algo do tipo abaixo, considerando que você já tenha uma função para cálculo de fatorial (se entendi direito o 2!):

 

 

function CalculaSerie (valor:integer):Double;
begin
      if valor = 1 then
         result := 1
      else
         result := (1/fatorial(valor)) + CalculaSerie(valor -1);
end;

 

Note que, se você digitar como entrada o valor 4 na função acima, o cálculo ficaria:

Resultado = (1/4!) + (1/3!) + (1/2!) + 1

 

Ps.: Não testei a função acima, fiz de cabeça e precisaria ser testada com calma. Verá que não trato nela se o valor informado é negativo por exemplo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado, me salvou de novo. Ainda não aprofundaram nessa matéria e explicaram bem por cima, mas agora entendendo a condição de parada ficou mais claro na minha cabeça! No algoritmo que eu tinha efeito, apesar de funcionar perfeitamente, tem um pequeno bug. O meu resultado sempre fica 1 número maior do que é pra ser. Se o calculo certo a resposta é por exemplo "2,5333" tenho como resultado "3,5333". Resolvi isso colocando um -1 na hora de escrever no label, grande gambiarra, pois não consegui encontrar o erro.

 

ALGORITMO:

 

procedure TForm2.Button1Click(Sender: TObject); //MODULO PRINCIPAL
var x:real;
begin
x := strtofloat(Edit1.Text);
if (x>1) then
Label2.Caption := 'S = ' + (floattostr(calc(x) -1));
if (X = 0) OR (x = 1) then
Label2.Caption := 'S = 1';
if x<0 then showmessage('Digite um valor menor ou igual a 0');
End;
function TForm2.Calc(x: real): real; //FUNÇÃO CALC
begin
if x > 0 then result:= 1/fatorial(x) + calc(x-1);
end;
function TForm2.Fatorial(x: real): real; //FUNÇÃO DO FATORIAL
begin
if (x <= 1) then
fatorial := 1
else
Result := (x * Fatorial(x-1));
end;
end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que tem um erro na sua lógica... veja que o problema que postou trás a seguinte regra:

 

 

nS = 1 + 1/2! + 1/3! + ... 1/n!

 

No seu código, você escreve o seguinte no seu botão:

 

 

    if (x>1) then
Label2.Caption := 'S = ' + (floattostr(calc(x)   -1));
 
    if (X = 0) OR (x = 1) then
Label2.Caption := 'S = 1';
    if x<0 then showmessage('Digite um valor menor ou igual a 0');

 

Aqui tem um erro... você deveria deixar sua função recursiva determinar isso (poderia por essa regra dentro dela para determinar o retorno, de modo que você simplesmente chamaria ela direto e mostraria no label o resultado ou geraria o alerta e abortaria o procedimento usando o exit).

 

Outra coisa que está errado: sua fórmula na recursão não condiz com o problema proposto. Seu código está:

 

 

function TForm2.Calc(x: real): real;   //FUNÇÃO CALC
begin
    if x > 0  then result:= 1/fatorial(x) + calc(x-1);
end;

 

O que sua fórmula retornará de valor se vier um zero por exemplo? Funções recursivas precisam ter um tratamento pra retornar um valor sempre. Outra coisa.... note que sua fórmula está excluindo o 1 da soma final que está no começo da fórmula que postou no seu post original. Não seria sua análise que está errada ao dizer que está com 1 a mais no resultado final?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.