Em relação aos conceitos de programação orientada a objetos ...
O resultado abaixo será obtido ao se executar o algoritmo que a ele se segue.
Resultado:
1 0;
0 0;
2 1;
1 0;
3 2;
2 2;
Algoritmo:
program p;
var v: inteiro;
funcao f(v: inteiro; var k:inteiro): inteiro;
var p,q:inteiro;
inicio
se v < 2
então inicio
f := v;
k := 0;
fim
senão inicio
f := f(v-1, p) + f(v-2, q);
k := p + q + 1;
fim;
escreva(n,' ',k,'; ');
fim ;
inicio
n := 4;
escreva(f(3,n),n);
fim
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Gabarito Comentado: Alternativa E - Errado
Vamos analisar a questão com cuidado. Este problema exige conhecimento de algoritmos recursivos e compreensão sobre funções e variáveis em um contexto de programação.
Primeiro, precisamos entender o que o algoritmo faz:
A função f é uma função recursiva que recebe dois parâmetros: v (inteiro) e k (inteiro passado por referência). Ela também utiliza duas variáveis locais, p e q.
Agora, vamos decompor este algoritmo recursivo:
1. Se v é menor que 2, f retorna v e define k como 0.
2. Se v é 2 ou maior, ele chama a si mesmo duas vezes: f(v-1, p) e f(v-2, q), e então retorna f(v-1, p) + f(v-2, q), definindo k como p + q + 1.
Vamos seguir a execução do algoritmo com n = 4 e calcular f(3, n).
1. f(3, n):
- Chama f(2, p) e f(1, q)
- f(2, p):
- Chama f(1, p) e f(0, q)
- f(1, p) retorna 1 e define p como 0
- f(0, q) retorna 0 e define q como 0
- f(2, p) retorna 1 e define p como 1 (p = 0 + 0 + 1)
- f(1, q) retorna 1 e define q como 0
- f(3, n) retorna 2 e define n como 2 (n = 1 + 0 + 1)
Portanto, os valores intermediários são:
- f(0, 0) = 0, k = 0
- f(1, 0) = 1, k = 0
- f(2, 1) = 1, k = 1
- f(1, 0) = 1, k = 0
- f(3, 2) = 2, k = 2
O resultado final que deve ser impresso é: 2 2
No entanto, considerando o enunciado da questão, o resultado esperado é diferente. Segundo o enunciado, o resultado seria:
1 0; 0 0; 2 1; 1 0; 3 2; 2 2;
Isso indica que a descrição da função talvez esteja errada ou que há um erro de transcrição no enunciado. A alternativa correta é E - Errado porque a execução do algoritmo não corresponde ao resultado fornecido no enunciado.
Espero que essa explicação tenha ajudado a entender melhor o funcionamento da recursão e a análise detalhada do algoritmo. Se tiver mais dúvidas, estarei à disposição para ajudar!
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
Eu marquei errado. Acertei na intuição, tentei fazer o caminho do algoritmo na mão. Mas não consegui entender direito algumas partes. Acredito que esteja me confundindo na ideia de passagem de parâmetros por valor e por referência. Alguém posta o resultado correto?
=)
Marquei errado logo de cara quando vi a linha "se v < 2", sendo q v é null.... daria exceção... ao meu entender.. será que estou certo?
f(v,k) -> é chamada em escreva (f(3,n),n) -> f(3,n) ou Seja, o valor de v = 3 e k = n.
Marquei errado, pois não aparece no algoritmo a declaração da variável "n" o que da erro de sintaxe.
marquei errado, pois pelo que entendi não existe atribuição de valor à variável p e a variável q para poder verificar a função.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo