As duas classes a seguir resolvem o mesmo problema, porém, a...

Próximas questões
Com base no mesmo assunto
Ano: 2013 Banca: FCC Órgão: DPE-SP Prova: FCC - 2013 - DPE-SP - Programador de computador |
Q304600 Programação
As duas classes a seguir resolvem o mesmo problema, porém, a ClasseB utiliza recursão e a ClasseA, não:

 public class ClasseB {
      public static void main(String[] args) {
          Scanner in = new Scanner(System.in);
          System.out.print("Entre com o valor de n:");
          int n = in.nextInt();
          for (int i = 1; i <= n; i++) {
               long f = teste(i);
               System.out.println(f);
     }
}
 public static long teste(int n) {
          if (n <= 2) {
          return 1;
          } else {
          return teste(n - 1) + teste(n - 2);
     }
  }
}
 
import java.util.Scanner;
 public class ClasseA {
      public static void main(String[] args) {
          Scanner in = new Scanner(System.in);
          System.out.print("Entre com o valor de n:");
          int n = in.nextInt();
          for (int i = 1; i <= n; i++) {
          long f = teste(i);
          System.out.println(f);
    }
}
 public static long teste(int n) {
          if (n <= 2)
          return 1;
          long a=1;
          long b=1;
          long c = 1;
          for (int i=3; i<=n; i++){
          c=a+b;
          b=a;
          a=c;
    }
          return c;
  }
}


Analisando as duas classes e refletindo sobre o uso de recursão é possível concluir que
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Gabarito: Letra C

Esta questão aborda a compreensão do funcionamento e das diferenças de desempenho entre algoritmos recursivos e iterativos. O contexto da questão está na implementação de um algoritmo comum em testes de programação: cálculo dos termos da sequência de Fibonacci.

Na ClasseB, que utiliza a recursão, a função teste() chama a si mesma para calcular o próximo termo da sequência. Já na ClasseA, a iteração (uso de loops) é aplicada para alcançar o mesmo resultado. A principal diferença entre essas duas abordagens está no uso da memória e no tempo de processamento.

O uso da recursão, como na ClasseB, cria muitas chamadas de funções e armazenamento de contextos de execução na pilha de chamadas, o que é ineficiente para valores grandes de n. Isso leva a uma execução mais lenta e a um maior consumo de memória, podendo até mesmo causar estouro de pilha (stack overflow) em alguns casos.

Por outro lado, a ClasseA usa um método iterativo que mantém apenas um conjunto fixo de variáveis, sem necessidade de armazenar múltiplos contextos de execução. Isso torna o algoritmo muito mais eficiente em termos de tempo e uso de memória, principalmente para valores maiores de n, como 50.

Portanto, a alternativa C está correta pois afirma que se o valor digitado e armazenado na variável n for 50, a ClasseA, que não utiliza recursão, executa mais rapidamente que a ClasseB.

As demais alternativas estão incorretas porque a alternativa A contradiz a ineficiência conhecida da recursão em valores altos de n; a B e a D apresentam sequências numéricas que não correspondem à sequência de Fibonacci; e a E é falsa, pois a recursão não melhora a eficiência do algoritmo em todas as situações, especialmente em casos de cálculo de Fibonacci para valores altos de n.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

 Uma implementação recursiva precisa registrar o estado atual do processamento de maneira que ela possa continuar de onde parou após a conclusão de cada nova execução subordinada do procedimento recursivo. Esta ação consome tempo e memória.

http://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)

Temos nos 2 casos classes que imprimem os N primeiros números da sequência de Fibonacci (1, 1, 2, 3, 5, 8, 13, ...).

As alternativas B e D estão obviamente erradas porque não apresentam a sequência correta a ser produzida.

Resta analisar o desempenho de uma implementação recursiva em relação a uma implementação iterativa. Vide o link do colega Jorge.


Detalhe: tomada separadamente, sem o "import java.util.Scanner;", a ClasseB não funciona!

Sem identação fica complicado ler esse código... srsr

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo