Analise o código R a seguir. xpto <- function(k) { if (k > 0) { a <- k + xpto(k - 2) print(a) } else { a = 0 return(a) } } xpto(7) Assinale o conjunto completo de valores exibidos na execução desse código, na ordem em que foram gerados.
- A)1 4 9
Errada, porque omite o último valor impresso na volta da recursão.
- B)1 4 9 16
Correta, pois a função imprime 1, 4, 9 e 16 nessa ordem ao retornar das chamadas recursivas.
- C)9 4 1
Errada, porque essa ordem estaria invertida, como se o print ocorresse antes das chamadas internas terminarem.
- D)16 9 4 1
Errada, porque inclui os valores ao contrário da ordem real de execução do print.
Gabarito: B
Este código em R usa recursão, ou seja, a função chama a si mesma até chegar ao caso base. Aqui, o caso base é quando k <= 0, momento em que a função devolve 0 e para de descer. Depois disso, os valores começam a voltar da pilha de chamadas, e é nessa volta que o print(a) acontece.\n\nPara xpto(7), a sequência de chamadas vai até xpto(-1). Na volta, os cálculos ficam assim: xpto(1) imprime 1, xpto(3) imprime 4, xpto(5) imprime 9 e xpto(7) imprime 16. Repare no padrão: cada nível soma o valor de k ao resultado retornado pelo nível anterior.\n\nPor isso, os valores exibidos aparecem em ordem crescente de profundidade da recursão de retorno: 1, 4, 9, 16. O gabarito B está correto porque reúne exatamente todos os valores impressos, na ordem em que surgem no console.\n\nEm R, return(a) no caso base encerra a função naquele ponto, e print(a) nas chamadas superiores é executado apenas quando a recursão está desfazendo a pilha. É aquele clássico truque de prova: a execução desce primeiro, mas a impressão acontece na subida.