Considere o seguinte trecho de algoritmo: função calcular(valor inteiro x) retorna inteiro { inteiro resultado se (x <= 1) { resultado = 1 } senão se (x mod 2 == 0) { resultado = x / 2 + calcular(x - 1) } senão { resultado = x * 3 + calcular(x - 2) } retorna resultado } início { inteiro num = 5 inteiro res = calcular(num) escreva("Resultado: ", res) } A saída do programa após sua execução será:
- A)Resultado: 16
Errada, porque o valor calculado pela recursão não chega a 16; ao expandir as chamadas, o resultado final é maior.
- B)Resultado: 25
Certa, pois calcular(5) = 15 + calcular(3) e calcular(3) = 9 + calcular(1), com calcular(1) = 1, totalizando 25.
- C)Resultado: 28
Errada, pois 28 não aparece na soma das chamadas recursivas dessa função.
- D)Resultado: 34
Errada, porque a expansão correta das chamadas não produz 34.
Gabarito: B
Aqui a chave é ler a função como uma sequência de chamadas recursivas. Quando x é menor ou igual a 1, ela devolve 1, servindo como caso base. Se x for par, soma x / 2 com a chamada de x - 1. Se x for ímpar, soma x * 3 com a chamada de x - 2. Isso faz a função “cair” até chegar no caso base, montando o resultado aos poucos. No programa, num vale 5. Como 5 é ímpar, temos calcular(5) = 5 * 3 + calcular(3) = 15 + calcular(3). Agora 3 também é ímpar: calcular(3) = 3 * 3 + calcular(1) = 9 + 1 = 10. Voltando uma etapa, calcular(5) = 15 + 10 = 25. Então a saída exibida será "Resultado: 25". Em resumo: o pulo do gato é acompanhar a recursão sem se perder no caminho. Em questão de concurso, vale sempre identificar primeiro o caso base e depois ir substituindo as chamadas uma por uma.