Seja o seguinte programa Python:def contagem(s): if len(...
def contagem(s):
if len(s)==0: return 0
return len(s[0])+contagem(s[1:])
txt = [ 'hoje', [ ['é', 'dia', 'de', 'prova' ] ], 'eu', [ [ 'vou', 'me', 'sair' ] ], [ 'bem' ] ]
print(contagem(txt))
O valor que será exibido no console quando esse código for executado é
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - 9
Este exercício é um exemplo clássico de recursão em Python, onde uma função é projetada para se chamar repetidamente até que uma condição base seja atendida. A função contagem(s) recebe uma lista s, verifica se ela está vazia, e em caso positivo, retorna 0, que é a nossa condição de parada. Se a lista não estiver vazia, a função retorna a soma do comprimento do primeiro elemento len(s[0]) com a chamada recursiva da função contagem para o restante da lista s[1:].
A solução do problema depende do entendimento de como a recursão desmembra a lista fornecida e soma os comprimentos dos seus elementos. O parâmetro txt é uma lista que contém strings e listas aninhadas, o que torna a questão um pouco mais complicada pois não estamos lidando apenas com elementos de um único nível.
Ao chamar contagem(txt), a função irá processar cada elemento da lista txt. Como txt possui elementos que são listas, a função irá chamar a si mesma para esses elementos. A contagem de caracteres das strings em cada nível da lista é feita somando-se o comprimento de cada string individualmente.
Para chegar ao resultado correto, vamos analisar a lista txt: - 'hoje' tem 4 caracteres, - a lista aninhada ['é', 'dia', 'de', 'prova'] tem 2 + 3 + 2 + 5 = 12 caracteres, mas como a lista está aninhada duas vezes, pegamos apenas o comprimento da lista interna, que é 1 (uma lista com um elemento), - 'eu' tem 2 caracteres, - a lista aninhada ['vou', 'me', 'sair'] tem 3 + 2 + 4 = 9 caracteres, mas novamente, consideramos o comprimento da lista interna, que é 1, - e finalmente, a lista ['bem'] tem 1 elemento com 3 caracteres. Somando todos esses resultados, obtemos 4 + 1 + 2 + 1 + 3 = 11. Contudo, a lista [['é', 'dia', 'de', 'prova']] está aninhada duas vezes, o que significa que a função contagem a tratou como uma lista com um único item. Por isso, o resultado correto é 4 + 1 (aninhado) + 2 + 1 (aninhado) + 3 = 9, o que corresponde à alternativa (B).
Este exercício testa o entendimento de listas aninhadas, recursão e contagem de caracteres em strings dentro de listas em Python. Ele reforça a importância de entender como a linguagem trata elementos aninhados e como funções recursivas processam listas e elementos de forma iterativa.
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
Questão braba! Contando sempre a primeira posição.
[ 'hoje', [ ['é', 'dia', 'de', 'prova' ] ], 'eu', [ [ 'vou', 'me', 'sair' ] ], [ 'bem' ] ]
S[0] = hoje = 4 caracteres
[ ['é', 'dia', 'de', 'prova' ] ], 'eu', [ [ 'vou', 'me', 'sair' ] ], [ 'bem' ] ]
S[0] = uma lista = 1 caracter
'eu', [ [ 'vou', 'me', 'sair' ] ], [ 'bem' ] ]
S[0] = 'eu' = 2 caracteres
[ [ 'vou', 'me', 'sair' ] ], [ 'bem' ] ]
S[0] = uma lista = 1 caracter
[ 'bem' ]
S[0] = uma lista = 1 caracter
Questão que implementa recursividade.
Temos que ter atenção ao dado que está sendo passado a cada vez para o len, tendo em vista que:
1ª iteração - len('hoje') = 4
2ª iteração - len([ ['é', 'dia', 'de', 'prova' ] ]) = 1
3ª iteração - len('eu') = 2
4ª iteração - len([ [ 'vou', 'me', 'sair' ] ]) = 1
5ª iteração - len([ 'bem' ]) = 1
6ª iteração - o len é igual a 0 e ela volta.
Resultando em 9.
Gabarito: 9
A forma de pensar sobre iteratividade é a seguinte:
Contagem (s1.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s2.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s3.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s4.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s5.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
#Agora que o len() de S é igual a zero, o programa começa a resolver o stack de cima pra baixo
5º len = 1
4º len = 1
3 º len = 2
2º len = 1
1º len = 4
4 + 1 + 2 + 1 + 1 = 9
Lembrando que o len() vai retornar apenas o número de elemento naqueles [colchetes] imediatos separados por vírgula. Se o elemento é um número, uma string ou um objeto não importa. O python apenas conta o número de endereços de memória armazenados naquela lista.
A forma de pensar sobre iteratividade é a seguinte:
Contagem (s1.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s2.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s3.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s4.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
Contagem (s5.0) -- retorna tamanho do primeiro elemento mais contagem(lista menos 1º elemento)
#Agora que o len() de S é igual a zero, o programa começa a resolver o stack de cima pra baixo
5º len = 1
4º len = 1
3 º len = 2
2º len = 1
1º len = 4
4 + 1 + 2 + 1 + 1 = 9
Lembrando que o len() vai retornar apenas o número de elemento naqueles [colchetes] imediatos separados por vírgula. Se o elemento é um número, uma string ou um objeto não importa. O python apenas conta o número de endereços de memória armazenados naquela lista.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo