As duas classes a seguir resolvem o mesmo problema, porém, a...
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
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
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