Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — CESPE / CEBRASPE 2024

ProgramaçãoLinguagens de programação
Código
ce176020
Banca
CESPE / CEBRASPE
Órgão
LNA
Ano
2024
Nível
Superior
Cargo
Tecnologista – Especialidade: Desenvolvimento e Arquitetura de Software
Imagem associada para resolução da questãoAssinale a opção em que é apresentado o resultado da execução do trecho de código precedente, desenvolvido em JavaScript.
  1. A5
  2. B10
  3. C20
  4. D120
  5. EReferenceError: y is not defined
Revelar gabarito e comentário

GabaritoD — 120

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Resolução

Gabarito: letra D — a conta chega a 120 (alternativa D).

A ideia por trás

Recursão é uma técnica em que uma função chama a si mesma para resolver um problema menor, até chegar a um caso base que interrompe as chamadas. No JavaScript, cada chamada cria um novo contexto na pilha de execução, e quando o caso base é atingido, as chamadas retornam em ordem inversa, combinando os resultados.

A função fatorial é definida por n! = n * (n-1)!, com 0! = 1! = 1. Isso significa que para calcular o fatorial de um número, multiplicamos o número pelo fatorial do número anterior, e assim por diante, até chegar a 1. A recursão implementa exatamente essa definição: cada chamada reduz o problema em 1, e o caso base (n < 2) retorna 1.

Esta questão cobra a execução de uma função recursiva que calcula o fatorial. Para resolver, é preciso simular as chamadas até o caso base e depois combinar os resultados na volta.

O que a questão dá

  • função y(n) definida recursivamente

  • chamada y(5)

  • caso base: se n < 2, retorna 1

  • caso recursivo: retorna n * y(n-1)

O que queremos: o resultado da execução de y(5)

Passo 1 — Simular a primeira chamada

Para entender o que a função faz, começamos pela chamada inicial y(5). Como 5 não é menor que 2, a função retorna 5 * y(4). Isso significa que o resultado final depende do resultado de y(4).

Por que esta fórmula: A definição da função é: se n < 2, retorna 1; senão, retorna n * y(n-1). Para n=5, a condição é falsa, então usamos a segunda parte.

y(5)=5×y(4)y(5) = 5 \times y(4)

De onde vem cada valor: 55 = definição: chamada inicial y(5) · y(4)y(4) = definição: chamada recursiva com n-1

y(5)=5×y(4)=5 y(4)y(5) = 5 \times y(4) = \boxed{5\ * \text{y}(4)}
NÃO CAIA NESSA!

Achar que y(5) retorna 5 diretamente, sem considerar a recursão.

Passo 2 — Simular as chamadas intermediárias

Precisamos continuar expandindo as chamadas até chegar ao caso base. Cada chamada reduz o argumento em 1, então vamos de y(4) até y(1).

Por que esta fórmula: A mesma regra se aplica: para n=4, 3, 2, a condição n < 2 é falsa, então cada uma retorna n * y(n-1).

y(4)=4×y(3),y(3)=3×y(2),y(2)=2×y(1)y(4) = 4 \times y(3), \quad y(3) = 3 \times y(2), \quad y(2) = 2 \times y(1)

De onde vem cada valor: 44 = definição: chamada y(4) · 33 = definição: chamada y(3) · 22 = definição: chamada y(2) · y(1)y(1) = definição: chamada recursiva com n-1

y(4)=4×y(3),y(3)=3×y(2),y(2)=2×y(1)y(4) = 4 \times y(3), \quad y(3) = 3 \times y(2), \quad y(2) = 2 \times y(1)

expressões encadeadas

NÃO CAIA NESSA!

Parar antes de chegar ao caso base, calculando apenas 5*4.

Passo 3 — Aplicar o caso base

A recursão precisa parar em algum momento. Quando n=1, a condição n < 2 é verdadeira, então a função retorna 1. Esse é o caso base que permite começar a voltar.

Por que esta fórmula: A definição da função diz explicitamente: se n < 2, retorna 1. Para n=1, isso se aplica.

y(1)=1y(1) = 1

De onde vem cada valor: 11 = definição: chamada y(1)

y(1)=1=1y(1) = 1 = \boxed{1}
NÃO CAIA NESSA!

Esquecer o caso base e tentar continuar para y(0), o que causaria recursão infinita.

Passo 4 — Calcular os retornos na volta

Com o caso base resolvido, agora voltamos pelas chamadas, substituindo cada y(n) pelo valor calculado. Isso é o 'desempilhar' da recursão.

Por que esta fórmula: Cada retorno é a multiplicação do número pelo valor da chamada anterior. Começamos de y(2) = 2 * y(1) = 21 = 2, depois y(3) = 32 = 6, e assim por diante.

y(2)=2×1=2,y(3)=3×2=6,y(4)=4×6=24y(2) = 2 \times 1 = 2, \quad y(3) = 3 \times 2 = 6, \quad y(4) = 4 \times 6 = 24

De onde vem cada valor: 22 = definição: chamada y(2) · 11 = passo 3: resultado de y(1) · 33 = definição: chamada y(3) · 66 = passo 4: resultado de y(2) · 44 = definição: chamada y(4) · 2424 = passo 4: resultado de y(3)

y(2)=2×1=2,y(3)=3×2=6,y(4)=4×6=24y(2) = 2 \times 1 = 2, \quad y(3) = 3 \times 2 = 6, \quad y(4) = 4 \times 6 = 24
y(4)=24y(4) = \boxed{24}
NÃO CAIA NESSA!

Multiplicar na ordem errada, por exemplo, 43 = 12 em vez de 46.

Passo 5 — Calcular o resultado final

Agora temos o valor de y(4), que é 24. Substituímos na primeira chamada para obter o resultado final.

Por que esta fórmula: Da primeira chamada, y(5) = 5 * y(4). Com y(4) = 24, temos 5 * 24 = 120.

y(5)=5×24=120y(5) = 5 \times 24 = 120

De onde vem cada valor: 55 = definição: chamada inicial · 2424 = passo 4: resultado de y(4)

y(5)=5×24=120=120y(5) = 5 \times 24 = 120 = \boxed{120}
NÃO CAIA NESSA!

Confundir com 5*4 = 20, ignorando os demais fatores.

Resposta: 120 (alternativa D)

Link permanente: /questoes/ce176020