Questão nº 39
Questão de Tecnologia da Informação · FCC SEGEP-MA 2018 (nº 39)
FCC2018Analista Executivo - Programador de SistemasTecnologia da Informação
Gabarito: Dver comentário ↓
Considere o método abaixo, criado em Java:
public int ack(int n, int m){
int ack;
if(n==0)
ack = m + 1;
else if (n>0 && m==0)
ack = ack(n - 1, m);
else
ack = ack(n - 1, ack(n, m - 1));
return ack;
}
Se n receber 1 e m receber 4,
- Ao método `ack` retornará o valor `12` presente na variável `ack`.
- Bocorrerá um erro, pois não é possível usar uma variável no interior do método que tenha o mesmo nome do método.
- Co método `ack` retornará o valor `0`, resultante das diversas chamadas recursivas ao método `ack`.
- Do método `ack` retornará o valor `5` presente na variável `ack`. (alternativa correta)
- Eocorrerá um erro, pois uma chamada recursiva não pode receber um argumento que inclui outra chamada recursiva.
Resposta comentada
Gabarito Alternativa D
A recursão é uma técnica de programação onde uma função (ou método) chama a si mesma para resolver um problema. Ela funciona dividindo um problema grande em versões menores e mais simples de si mesmo, até atingir um caso base que pode ser resolvido diretamente, sem mais chamadas recursivas.
- (A) Incorreta: A execução do método
ack(1, 4)resulta no valor5, não12. - (B) Incorreta: Em Java, é permitido ter uma variável local com o mesmo nome do método. O compilador distingue entre a variável (
ack) e a chamada do método (ack(...)) pelo contexto de uso. Armadilha da banca: Iniciantes podem confundir a variável local com o nome do método, pensando que há um conflito de nomes. - (C) Incorreta: A execução do método
ack(1, 4)resulta no valor5. O caso basem + 1garante que o retorno será sempre maior que 0 param >= 0. - (D) Correta: Ao rastrear a execução de
ack(1, 4):ack(1, 4)chamaack(0, ack(1, 3))ack(1, 3)chamaack(0, ack(1, 2))ack(1, 2)chamaack(0, ack(1, 1))ack(1, 1)chamaack(0, ack(1, 0))ack(1, 0)(onden=1, m=0) chamaack(0, 0)ack(0, 0)(onden=0) retorna0 + 1 = 1ack(1, 0)retorna1ack(1, 1)se tornaack(0, 1)que retorna1 + 1 = 2ack(1, 2)se tornaack(0, 2)que retorna2 + 1 = 3ack(1, 3)se tornaack(0, 3)que retorna3 + 1 = 4ack(1, 4)se tornaack(0, 4)que retorna4 + 1 = 5.
- (E) Incorreta: É uma prática comum e válida em programação que o argumento de uma função seja o resultado de outra chamada de função (mesmo que recursiva). A chamada interna é avaliada primeiro, e seu resultado é passado como argumento para a chamada externa.
Fonte: FCC SEGEP-MA 2018 Analista Executivo - Programador de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.