Exercícios de estruturas de dados com respostas

As 59 questões vêm das aulas do Curso de Lógica de Programação Avançado, uma de cada aula e na ordem do curso, e passam por pilhas, filas, listas ligadas, árvores, grafos, tabelas hash, recursão e programação dinâmica. Tente responder antes de abrir a resposta comentada, que explica o raciocínio e diz em qual aula o assunto é ensinado.

Como usar: leia a pergunta, escolha a sua alternativa e só depois abra "Ver a resposta". Quando errar, a explicação diz por que e o link leva à aula que ensina o assunto. As mesmas questões aparecem nas aulas como teste rápido, e o Curso de Lógica de Programação Avançado é gratuito do começo ao fim.

Módulo 1: Boas-vindas ao avançado

Questão 1 · aula O salto para o avançado: de resolver a projetar

Qual frase resume melhor a ideia central do nível avançado?

  1. Basta o programa devolver a resposta certa, o resto não importa.
  2. Um bom programa combina a estrutura de dados certa com o algoritmo certo, pensando em como se comporta quando os dados crescem.
  3. Quanto mais linhas de código, melhor a solução.
  4. Estrutura de dados e algoritmo são termos decorativos, sem efeito prático.
Ver a resposta

Resposta: B. Um bom programa combina a estrutura de dados certa com o algoritmo certo, pensando em como se comporta quando os dados crescem.

O avançado é sobre projetar: escolher onde e como os dados moram (estrutura) e o passo a passo que age sobre eles (algoritmo), de modo que o programa continue rápido e claro mesmo com muitos dados. Resposta certa é só o ponto de partida.

Estudar a aula: O salto para o avançado: de resolver a projetar

Questão 2 · aula Tipo abstrato de dados: o contrato antes do código

O que um tipo abstrato de dados descreve?

  1. O código exato, linha por linha, de como a estrutura é feita por dentro.
  2. As operações que a estrutura oferece e como elas se comportam, sem fixar como isso é implementado.
  3. A cor e o tamanho da estrutura na tela.
  4. A única maneira possível de guardar os dados na memória.
Ver a resposta

Resposta: B. As operações que a estrutura oferece e como elas se comportam, sem fixar como isso é implementado.

O TAD é um contrato: descreve quais operações existem e como elas se comportam, o que a estrutura faz. Ele deixa de fora o como, ou seja, a implementação. Por isso a mesma interface pode ter várias implementações válidas por dentro.

Estudar a aula: Tipo abstrato de dados: o contrato antes do código

Questão 3 · aula O mapa do avançado: estruturas guardam, algoritmos agem

Qual a diferença entre uma estrutura de dados e um algoritmo?

  1. Não há diferença: os dois termos significam a mesma coisa.
  2. A estrutura de dados guarda e organiza a informação; o algoritmo é o passo a passo que age sobre ela.
  3. A estrutura de dados só serve para números e o algoritmo só para textos.
  4. O algoritmo guarda os dados e a estrutura os processa.
Ver a resposta

Resposta: B. A estrutura de dados guarda e organiza a informação; o algoritmo é o passo a passo que age sobre ela.

A estrutura de dados responde a pergunta onde e como os dados ficam guardados (pilha, fila, árvore, grafo). O algoritmo responde como agir sobre eles (buscar, ordenar, percorrer). As duas famílias se combinam: cada problema pede a dupla certa.

Estudar a aula: O mapa do avançado: estruturas guardam, algoritmos agem

Módulo 2: Pilhas: a estrutura em que o último entra e sai primeiro

Questão 4 · aula O que é uma pilha (LIFO)

Qual frase descreve corretamente a regra de uma pilha?

  1. O primeiro item a entrar é o primeiro a sair.
  2. O último item a entrar é o primeiro a sair, e só o topo é acessível.
  3. Qualquer item pode ser retirado a qualquer momento, sem ordem.
  4. Os itens saem sempre em ordem alfabética.
Ver a resposta

Resposta: B. O último item a entrar é o primeiro a sair, e só o topo é acessível.

A pilha segue a regra LIFO: o último a entrar é o primeiro a sair. E ela só permite mexer no topo. Retirada de qualquer posição é comportamento de lista, e ordem alfabética não tem nada a ver com a estrutura pilha.

Estudar a aula: O que é uma pilha (LIFO)

Questão 5 · aula Empilhar, desempilhar e espiar o topo

Qual a diferença entre desempilhar e espiar o topo de uma pilha?

  1. Não há diferença, são dois nomes para a mesma coisa.
  2. Desempilhar retira o item do topo e altera a pilha; espiar apenas consulta o topo sem removê-lo.
  3. Espiar remove dois itens de uma vez; desempilhar remove um.
  4. Desempilhar mexe no fundo da pilha; espiar mexe no topo.
Ver a resposta

Resposta: B. Desempilhar retira o item do topo e altera a pilha; espiar apenas consulta o topo sem removê-lo.

Desempilhar remove o item do topo e o devolve, deixando a pilha com um item a menos. Espiar o topo só mostra quem está por cima, sem alterar a pilha. As duas olham o topo, mas só o desempilhar modifica a estrutura.

Estudar a aula: Empilhar, desempilhar e espiar o topo

Questão 6 · aula A pilha de chamadas e o botão desfazer

Por que a regra LIFO é ideal para um botão desfazer?

  1. Porque desfazer deve reverter as ações mais antigas primeiro.
  2. Porque desfazer deve reverter a última ação feita, que é justamente a que está no topo da pilha.
  3. Porque a pilha ordena as ações em ordem alfabética.
  4. Porque desfazer não tem relação nenhuma com pilhas.
Ver a resposta

Resposta: B. Porque desfazer deve reverter a última ação feita, que é justamente a que está no topo da pilha.

Desfazer sempre reverte a ação mais recente, a última que você fez. Numa pilha, a última ação empilhada está no topo e é a primeira a sair. Por isso a regra LIFO casa perfeitamente com o desfazer, revertendo do mais recente ao mais antigo.

Estudar a aula: A pilha de chamadas e o botão desfazer

Questão 7 · aula Parênteses balanceados com uma pilha

No algoritmo de parênteses balanceados, o que garante que a expressão (( seja considerada desbalanceada?

  1. Nada, o algoritmo não detecta esse caso.
  2. A checagem final, que exige que a pilha esteja vazia; como sobraram dois abre, ela devolve falso.
  3. O fato de a expressão ter só dois caracteres.
  4. A tentativa de desempilhar de uma pilha vazia logo no início.
Ver a resposta

Resposta: B. A checagem final, que exige que a pilha esteja vazia; como sobraram dois abre, ela devolve falso.

Em ((, os dois parênteses de abertura são empilhados e nunca há um fechamento para desempilhá-los. Ao fim do laço, a pilha ainda tem dois itens. A checagem final retorne vazia(pilha) percebe que a pilha não está vazia e devolve falso, marcando a expressão como desbalanceada.

Estudar a aula: Parênteses balanceados com uma pilha

Módulo 3: Filas: o primeiro a chegar é o primeiro a sair

Questão 8 · aula O que é uma fila: o comportamento FIFO

O que significa dizer que uma fila segue a regra FIFO?

  1. Que o último elemento a entrar é o primeiro a sair.
  2. Que o primeiro elemento a entrar é o primeiro a sair, preservando a ordem de chegada.
  3. Que os elementos saem em ordem aleatória.
  4. Que a fila só pode guardar números.
Ver a resposta

Resposta: B. Que o primeiro elemento a entrar é o primeiro a sair, preservando a ordem de chegada.

FIFO quer dizer primeiro a entrar, primeiro a sair. A fila preserva a ordem de chegada: quem entrou antes sai antes, como na fila do banco. É o oposto da pilha, que é LIFO e atende o último que chegou.

Estudar a aula: O que é uma fila: o comportamento FIFO

Questão 9 · aula Enfileirar e desenfileirar: as operações da fila

Em qual ponta da fila cada operação trabalha?

  1. Enfileirar e desenfileirar trabalham as duas na frente.
  2. Enfileirar adiciona no fim e desenfileirar remove da frente.
  3. Enfileirar adiciona na frente e desenfileirar remove do fim.
  4. As duas trabalham no meio da fila.
Ver a resposta

Resposta: B. Enfileirar adiciona no fim e desenfileirar remove da frente.

Enfileirar coloca no fim (quem chega vai para o final); desenfileirar tira da frente (o mais antigo é atendido). Cada operação em uma ponta. Essa separação é o que preserva a ordem de chegada e mantém o comportamento FIFO.

Estudar a aula: Enfileirar e desenfileirar: as operações da fila

Questão 10 · aula Fila de prioridade: quando furar a fila é justo

Numa fila de prioridade, quem é o próximo a sair?

  1. Sempre o elemento que chegou primeiro, como na fila comum.
  2. O elemento de maior prioridade; se houver empate, o que chegou primeiro entre os empatados.
  3. Sempre o último elemento que chegou.
  4. Um elemento escolhido ao acaso.
Ver a resposta

Resposta: B. O elemento de maior prioridade; se houver empate, o que chegou primeiro entre os empatados.

Na fila de prioridade, a importância decide antes da chegada: sai o de maior prioridade. A ordem de chegada entra só como critério de desempate, quando duas prioridades são iguais. Por isso um caso grave passa na frente de um leve que chegou antes.

Estudar a aula: Fila de prioridade: quando furar a fila é justo

Questão 11 · aula Pilha ou fila: escolhendo a estrutura certa

Um editor precisa de um botão desfazer, que sempre reverte a última ação feita primeiro. Qual estrutura é a certa?

  1. Fila, porque a última ação é a mais importante.
  2. Pilha, porque ela devolve o último elemento que entrou, e o desfazer reverte a ação mais recente.
  3. Fila de prioridade, porque toda ação tem a mesma prioridade.
  4. Nenhuma das duas, desfazer não usa estrutura de dados.
Ver a resposta

Resposta: B. Pilha, porque ela devolve o último elemento que entrou, e o desfazer reverte a ação mais recente.

Desfazer precisa reverter a ação mais recente primeiro, que é o comportamento LIFO da pilha: o último a entrar é o primeiro a sair. Cada ação é empilhada; desfazer desempilha a do topo. A fila faria o contrário, revertendo a ação mais antiga primeiro.

Estudar a aula: Pilha ou fila: escolhendo a estrutura certa

Módulo 4: Listas ligadas: a corrente de nós

Questão 12 · aula O nó e a ligação: a corrente de dados

Para que serve a cabeça de uma lista ligada?

  1. Guarda o maior valor da lista.
  2. É a referência para o primeiro nó, o ponto de entrada por onde se alcança toda a corrente.
  3. É o índice usado para acessar qualquer nó direto.
  4. É o nó que aponta para o nada no fim da lista.
Ver a resposta

Resposta: B. É a referência para o primeiro nó, o ponto de entrada por onde se alcança toda a corrente.

A cabeça é a referência ao primeiro nó. A partir dela você segue as ligações e alcança os demais. Não é índice (a lista ligada não tem acesso direto) nem é o fim (esse é o nó que aponta para o nada).

Estudar a aula: O nó e a ligação: a corrente de dados

Questão 13 · aula Inserir e remover: só religar ponteiros

Por que inserir um nó no meio de uma lista ligada não precisa empurrar os outros nós, como no vetor?

  1. Porque a lista ligada tem tamanho fixo e nunca cresce.
  2. Porque os nós não ficam encostados na memória; basta religar duas ligações para encaixar o novo nó na corrente.
  3. Porque o computador move os nós automaticamente por baixo.
  4. Porque a lista ligada só permite inserir no fim.
Ver a resposta

Resposta: B. Porque os nós não ficam encostados na memória; basta religar duas ligações para encaixar o novo nó na corrente.

Os nós vivem espalhados e são amarrados por ligações, não pela posição física. Inserir é só reapontar a ligação do anterior para o novo e a do novo para o seguinte. Nenhum outro nó muda de lugar, por isso o custo não depende do tamanho.

Estudar a aula: Inserir e remover: só religar ponteiros

Questão 14 · aula Lista ligada ou vetor: cada um no seu forte

Um programa precisa, o tempo todo, ler o elemento de uma posição qualquer da coleção (o item 10, depois o 900, depois o 3). Qual estrutura é mais adequada e por quê?

  1. A lista ligada, porque inserir é barato.
  2. O vetor, porque o acesso direto por índice chega a qualquer posição num passo só.
  3. Tanto faz, o custo é igual nas duas.
  4. A lista ligada, porque o acesso sequencial é mais rápido.
Ver a resposta

Resposta: B. O vetor, porque o acesso direto por índice chega a qualquer posição num passo só.

Acesso frequente por posição arbitrária é o forte do vetor: ele calcula onde a posição está e chega num passo. Na lista ligada, cada acesso percorreria a corrente desde a cabeça, o que ficaria caro justamente na operação mais repetida.

Estudar a aula: Lista ligada ou vetor: cada um no seu forte

Questão 15 · aula Listas duplas e circulares: variações da corrente

O que uma lista duplamente ligada tem que a lista ligada simples não tem?

  1. Um índice para acesso direto, como o vetor.
  2. Uma segunda ligação em cada nó, apontando para o anterior, o que permite andar nos dois sentidos.
  3. A garantia de nunca ter nós órfãos.
  4. O último nó apontando para o primeiro.
Ver a resposta

Resposta: B. Uma segunda ligação em cada nó, apontando para o anterior, o que permite andar nos dois sentidos.

A duplamente ligada acrescenta, em cada nó, uma ligação para o anterior, além da ligação para o próximo. Com ela dá para percorrer a corrente para frente e para trás. Índice é coisa do vetor; o último apontar para o primeiro é a lista circular, outra variação.

Estudar a aula: Listas duplas e circulares: variações da corrente

Módulo 5: Árvores: hierarquia, busca e percursos

Questão 16 · aula O que é uma árvore: raiz, nós e folhas

Numa árvore, o que é uma folha?

  1. O nó do topo, que não tem pai.
  2. Um nó que não tem nenhum filho, na ponta de um ramo.
  3. Qualquer nó que tenha exatamente dois filhos.
  4. A ligação entre dois nós.
Ver a resposta

Resposta: B. Um nó que não tem nenhum filho, na ponta de um ramo.

Folha é o nó que não aponta para nenhum outro abaixo dele; é onde o ramo termina. O nó do topo sem pai é a raiz, não a folha. A ligação entre nós é a aresta, e ter dois filhos não define uma folha.

Estudar a aula: O que é uma árvore: raiz, nós e folhas

Questão 17 · aula Árvore binária: no máximo dois filhos

O que define uma árvore binária?

  1. Toda árvore em que a raiz guarda um número.
  2. Uma árvore em que cada nó tem no máximo dois filhos, um esquerdo e um direito.
  3. Uma árvore em que cada nó tem exatamente três filhos.
  4. Uma árvore que não pode ter folhas.
Ver a resposta

Resposta: B. Uma árvore em que cada nó tem no máximo dois filhos, um esquerdo e um direito.

A árvore binária limita cada nó a no máximo dois filhos, identificados pela posição (esquerdo e direito). Um nó pode ter zero, um ou dois, mas nunca mais de dois. É essa restrição, e a posição dos filhos, que a distingue da árvore genérica.

Estudar a aula: Árvore binária: no máximo dois filhos

Questão 18 · aula Árvore de busca binária: menores à esquerda, maiores à direita

Na busca por um valor menor que o nó atual de uma BST, para onde a busca desce?

  1. Para o filho direito, ignorando a esquerda.
  2. Para o filho esquerdo, ignorando a direita.
  3. Para os dois filhos ao mesmo tempo.
  4. Volta para o pai do nó atual.
Ver a resposta

Resposta: B. Para o filho esquerdo, ignorando a direita.

A regra da BST é menores à esquerda. Se o alvo é menor que o nó atual, ele só pode estar na subárvore esquerda, então a busca desce à esquerda e descarta todo o lado direito. É esse descarte de um ramo inteiro a cada passo que torna a busca rápida.

Estudar a aula: Árvore de busca binária: menores à esquerda, maiores à direita

Questão 19 · aula Percorrer uma árvore: em-ordem, pré-ordem e pós-ordem

Qual percurso, aplicado a uma árvore de busca binária, devolve os valores em ordem crescente?

  1. Pré-ordem (raiz, esquerdo, direito).
  2. Em-ordem (esquerdo, raiz, direito).
  3. Pós-ordem (esquerdo, direito, raiz).
  4. Nenhum, é preciso ordenar depois.
Ver a resposta

Resposta: B. Em-ordem (esquerdo, raiz, direito).

O em-ordem visita o filho esquerdo, depois a raiz, depois o direito. Como numa BST o lado esquerdo guarda os menores e o direito os maiores, essa ordem faz os valores saírem do menor ao maior, já ordenados, sem nenhum passo extra de ordenação.

Estudar a aula: Percorrer uma árvore: em-ordem, pré-ordem e pós-ordem

Módulo 6: Grafos: vértices, arestas e o mundo em rede

Questão 20 · aula O que é um grafo: vértices e arestas

Qual é a diferença essencial entre uma árvore e um grafo qualquer?

  1. A árvore usa vértices e o grafo usa apenas números.
  2. A árvore é um grafo especial, sem ciclos e com uma raiz; o grafo geral aceita ciclos e não precisa de raiz.
  3. O grafo só pode ter até três vértices.
  4. Não há diferença, os dois nomes são sinônimos.
Ver a resposta

Resposta: B. A árvore é um grafo especial, sem ciclos e com uma raiz; o grafo geral aceita ciclos e não precisa de raiz.

A árvore é um grafo conexo, sem ciclos e com um vértice eleito raiz. O grafo geral é mais livre: aceita ciclos (caminhos que voltam ao início) e não exige raiz. Por isso toda árvore é grafo, mas nem todo grafo é árvore.

Estudar a aula: O que é um grafo: vértices e arestas

Questão 21 · aula Tipos de grafo: dirigido, não dirigido e com peso

Você quer achar a rota mais barata entre duas cidades, considerando o preço de cada trecho. Que tipo de grafo modela isso?

  1. Um grafo sem peso, porque o preço não importa.
  2. Um grafo com peso, onde cada aresta carrega o preço do trecho.
  3. Uma árvore, porque cidades formam hierarquia.
  4. Um grafo com um único vértice.
Ver a resposta

Resposta: B. Um grafo com peso, onde cada aresta carrega o preço do trecho.

Como o preço de cada trecho importa para decidir a rota mais barata, cada aresta precisa carregar esse custo. Isso é um grafo com peso: o número na aresta permite somar custos e comparar caminhos para achar o mais barato.

Estudar a aula: Tipos de grafo: dirigido, não dirigido e com peso

Questão 22 · aula Representar um grafo: lista e matriz de adjacência

Quanto espaço uma matriz de adjacência ocupa para um grafo de N vértices, e por quê?

  1. Espaço proporcional ao número de arestas, porque só guarda as ligações existentes.
  2. Espaço proporcional a N ao quadrado, porque é uma grade de N por N células, com um valor para cada par de vértices.
  3. Sempre 1 célula, independentemente do tamanho.
  4. Espaço proporcional a N, porque tem uma linha por vértice apenas.
Ver a resposta

Resposta: B. Espaço proporcional a N ao quadrado, porque é uma grade de N por N células, com um valor para cada par de vértices.

A matriz de adjacência é uma grade quadrada de N linhas por N colunas, uma célula para cada par de vértices. Isso dá N ao quadrado células, ocupadas mesmo quando a maioria vale zero. Por isso ela pesa em grafos esparsos e grandes, onde a lista de adjacência economiza.

Estudar a aula: Representar um grafo: lista e matriz de adjacência

Questão 23 · aula O mundo como grafo: redes, mapas e rotas

Você quer descobrir por quantos apertos de mão duas pessoas estão conectadas numa rede de amizades. Como isso vira um problema de grafo?

  1. Cada amizade vira um vértice e cada pessoa vira uma aresta.
  2. Cada pessoa vira um vértice, cada amizade vira uma aresta, e a resposta é o menor caminho em número de arestas entre as duas pessoas.
  3. É impossível modelar amizades como grafo.
  4. Basta contar quantas pessoas existem na rede.
Ver a resposta

Resposta: B. Cada pessoa vira um vértice, cada amizade vira uma aresta, e a resposta é o menor caminho em número de arestas entre as duas pessoas.

Pessoas são os vértices e amizades são as arestas. O número de apertos de mão entre duas pessoas é o comprimento do menor caminho (em arestas) entre elas no grafo, o famoso grau de separação. Modelar assim transforma a pergunta num problema de menor caminho.

Estudar a aula: O mundo como grafo: redes, mapas e rotas

Módulo 7: Percursos em grafos: largura, profundidade e caminho

Questão 24 · aula Busca em largura: explorar por camadas

Qual estrutura a busca em largura usa para guardar os vértices que ainda faltam visitar, e por quê?

  1. Uma pilha, porque quer visitar primeiro o último descoberto.
  2. Uma fila, porque quer visitar os vértices na ordem em que foram descobertos, o que produz a exploração por camadas.
  3. Uma matriz, porque precisa guardar linhas e colunas.
  4. Nenhuma estrutura, ela sorteia o próximo vértice ao acaso.
Ver a resposta

Resposta: B. Uma fila, porque quer visitar os vértices na ordem em que foram descobertos, o que produz a exploração por camadas.

A BFS usa uma fila (FIFO). Como o primeiro a entrar é o primeiro a sair, os vizinhos descobertos antes (os mais próximos) são visitados antes. É justamente isso que faz a busca avançar em camadas e alcançar cada vértice pelo caminho com menos passos.

Estudar a aula: Busca em largura: explorar por camadas

Questão 25 · aula Busca em profundidade: ir fundo primeiro

Na busca em profundidade escrita de forma recursiva, o que faz o papel da pilha que guarda o caminho de volta?

  1. Uma fila criada pelo programador no começo da busca.
  2. A própria pilha de chamadas de função: cada chamada empilha o caminho e cada retorno é o backtrack.
  3. O conjunto de visitados, que também serve de pilha.
  4. Nada, a recursão não precisa guardar o caminho de volta.
Ver a resposta

Resposta: B. A própria pilha de chamadas de função: cada chamada empilha o caminho e cada retorno é o backtrack.

Quando a DFS é recursiva, cada chamada para um vizinho empilha um quadro na pilha de chamadas do programa. Esse empilhamento é o registro do caminho de descida. Quando uma chamada termina, o controle volta para a anterior, e esse retorno é exatamente o backtrack acontecendo de graça.

Estudar a aula: Busca em profundidade: ir fundo primeiro

Questão 26 · aula Achar o caminho mais curto com a busca em largura

Para a busca em largura conseguir devolver o caminho mais curto, e não só a distância, o que ela precisa guardar?

  1. O número total de vértices do grafo.
  2. Para cada vértice descoberto, de qual vértice ele foi alcançado (o predecessor), para reconstruir a rota de trás para frente.
  3. A ordem alfabética dos vértices.
  4. Nada além do conjunto de visitados já usado na busca comum.
Ver a resposta

Resposta: B. Para cada vértice descoberto, de qual vértice ele foi alcançado (o predecessor), para reconstruir a rota de trás para frente.

A busca em largura acha a distância de graça, mas para mostrar o caminho é preciso lembrar de onde cada vértice veio. Guardando o predecessor de cada um, você segue do destino até o início por essa trilha e, invertendo, obtém o caminho mais curto completo.

Estudar a aula: Achar o caminho mais curto com a busca em largura

Questão 27 · aula Visitados e ciclos: como não andar em círculos

Por que uma busca num grafo com ciclo pode nunca terminar se você não usar o conjunto de visitados?

  1. Porque o grafo com ciclo tem infinitos vértices.
  2. Porque o ciclo permite voltar a vértices já vistos, e sem a marcação a busca os redescobre indefinidamente, num loop.
  3. Porque a fila e a pilha ficam sem espaço logo no início.
  4. Porque grafos com ciclo não podem ser percorridos de forma alguma.
Ver a resposta

Resposta: B. Porque o ciclo permite voltar a vértices já vistos, e sem a marcação a busca os redescobre indefinidamente, num loop.

Um ciclo cria uma rota que volta a um vértice já visitado. Sem o conjunto de visitados, a busca não percebe que já esteve ali, redescobre os mesmos vizinhos e gira para sempre. A marcação garante que cada vértice seja processado uma única vez, o que faz a busca terminar.

Estudar a aula: Visitados e ciclos: como não andar em círculos

Módulo 8: Recursão avançada: dividir, voltar e escolher

Questão 28 · aula Dividir para conquistar: quebrar, resolver e juntar

No merge sort, qual é a fase que realmente ordena os dados?

  1. A divisão, porque cortar a lista ao meio já deixa tudo em ordem.
  2. A combinação, quando duas metades já ordenadas são intercaladas numa lista maior ordenada.
  3. Nenhuma: o merge sort não ordena, só divide.
  4. A checagem do caso base, que reordena a lista inteira.
Ver a resposta

Resposta: B. A combinação, quando duas metades já ordenadas são intercaladas numa lista maior ordenada.

Dividir a lista ao meio não ordena nada; só quebra o problema. O trabalho de ordenar acontece na combinação, quando o algoritmo intercala duas metades já ordenadas comparando seus primeiros elementos. É por isso que, em dividir para conquistar, a fase de juntar costuma ser a mais importante.

Estudar a aula: Dividir para conquistar: quebrar, resolver e juntar

Questão 29 · aula A árvore de recursão: enxergar o trabalho total

O que a ALTURA da árvore de recursão representa?

  1. O número total de chamadas que a função faz.
  2. A profundidade da recursão: quantas chamadas ficam empilhadas ao mesmo tempo, uma esperando a outra.
  3. A quantidade de valores diferentes que a função pode devolver.
  4. A velocidade do computador que roda o código.
Ver a resposta

Resposta: B. A profundidade da recursão: quantas chamadas ficam empilhadas ao mesmo tempo, uma esperando a outra.

A altura da árvore é a profundidade da recursão, ou seja, quantas chamadas ficam abertas simultaneamente na pilha de chamadas. O número total de chamadas depende também da largura (quantas chamadas por nível). Uma árvore pode ser alta e fina (profunda mas com poucas chamadas) ou baixa e larga.

Estudar a aula: A árvore de recursão: enxergar o trabalho total

Questão 30 · aula Backtracking: tentar um caminho e voltar

No backtracking, o que acontece quando a tentativa atual chega a um beco sem saída?

  1. O algoritmo para e não encontra solução nenhuma.
  2. A última escolha é desfeita e o algoritmo volta para tentar a próxima opção daquele ponto.
  3. Todas as escolhas anteriores são apagadas de uma vez.
  4. O algoritmo escolhe uma casa aleatória para recomeçar.
Ver a resposta

Resposta: B. A última escolha é desfeita e o algoritmo volta para tentar a próxima opção daquele ponto.

Beco sem saída não encerra a busca: o backtracking desfaz apenas a última escolha e retorna ao ponto anterior para tentar a próxima opção. Só quando todas as opções de todos os pontos se esgotam é que a busca termina sem solução. Esse voltar controlado, um passo de cada vez, é a essência da técnica.

Estudar a aula: Backtracking: tentar um caminho e voltar

Questão 31 · aula Recursão ou iteração: qual escolher

Qual é a principal desvantagem da recursão frente a um laço, para uma repetição linear muito longa?

  1. A recursão dá sempre um resultado errado.
  2. Cada chamada ocupa espaço na pilha, então uma profundidade muito grande pode estourá-la, enquanto o laço roda em profundidade constante.
  3. A recursão não consegue devolver valores.
  4. O laço é o único que funciona com números.
Ver a resposta

Resposta: B. Cada chamada ocupa espaço na pilha, então uma profundidade muito grande pode estourá-la, enquanto o laço roda em profundidade constante.

Recursão e laço resolvem o mesmo, mas cada chamada recursiva aberta ocupa memória na pilha de chamadas. Numa repetição linear muito profunda (por exemplo, um milhão de passos), a recursão simples pode estourar a pilha, enquanto o laço mantém o estado em poucas variáveis e roda em profundidade constante. Por isso, para repetição linear longa, o laço é mais seguro.

Estudar a aula: Recursão ou iteração: qual escolher

Módulo 9: Ordenação eficiente: merge sort e quick sort

Questão 32 · aula Por que O(n log n) ganha de O(n ao quadrado)

Por que O(n log n) supera O(n ao quadrado) justamente em listas grandes?

  1. Porque em listas pequenas o computador desliga a otimização.
  2. Porque o fator log n cresce muito devagar, então a diferença entre as duas curvas aumenta conforme a lista cresce.
  3. Porque O(n log n) nunca faz nenhuma comparação.
  4. Porque listas grandes sempre já vêm ordenadas.
Ver a resposta

Resposta: B. Porque o fator log n cresce muito devagar, então a diferença entre as duas curvas aumenta conforme a lista cresce.

As duas curvas quase se encostam em listas pequenas. À medida que n cresce, o termo n ao quadrado dispara enquanto o fator log n mal se mexe. Por isso a vantagem do método eficiente só fica visível, e depois gritante, em listas grandes.

Estudar a aula: Por que O(n log n) ganha de O(n ao quadrado)

Questão 33 · aula Merge sort: dividir e intercalar

Por que intercalar duas listas já ordenadas é uma operação rápida?

  1. Porque o computador ordena as duas de novo antes de juntar.
  2. Porque basta comparar os elementos da frente de cada lista e escolher o menor, visitando cada elemento uma única vez.
  3. Porque listas ordenadas nunca precisam ser comparadas.
  4. Porque a intercalação embaralha as listas primeiro.
Ver a resposta

Resposta: B. Porque basta comparar os elementos da frente de cada lista e escolher o menor, visitando cada elemento uma única vez.

Como as duas metades já chegam ordenadas, o menor elemento do resultado é sempre um dos dois que estão na frente. Basta comparar essas frentes e avançar o marcador do lado escolhido. Cada elemento entra no resultado uma vez só, então o custo é proporcional ao tamanho total.

Estudar a aula: Merge sort: dividir e intercalar

Questão 34 · aula Quick sort: pivô e partição

Depois de uma partição do quick sort, o que se pode afirmar sobre o pivô?

  1. Ele volta para o início da lista sempre.
  2. Ele já está na posição que ocuparia na lista ordenada e não precisa mais ser movido.
  3. Ele é descartado e não entra no resultado.
  4. Ele fica sempre exatamente no meio da lista.
Ver a resposta

Resposta: B. Ele já está na posição que ocuparia na lista ordenada e não precisa mais ser movido.

A partição deixa os menores à esquerda e os maiores à direita do pivô. Com isso, nenhum elemento menor pode estar depois dele e nenhum maior antes: o pivô já está no seu lugar definitivo da lista ordenada. Por isso cada partição resolve pelo menos um elemento para sempre.

Estudar a aula: Quick sort: pivô e partição

Questão 35 · aula Escolher o algoritmo certo

O que caracteriza uma ordenação estável?

  1. Ela nunca erra a ordem de nenhum elemento.
  2. Ela mantém a ordem original entre elementos que têm o mesmo valor de chave.
  3. Ela sempre usa menos memória que as outras.
  4. Ela só funciona com números inteiros.
Ver a resposta

Resposta: B. Ela mantém a ordem original entre elementos que têm o mesmo valor de chave.

Estabilidade é sobre os empates: numa ordenação estável, dois itens com a mesma chave saem na mesma ordem em que entraram. Isso permite ordenar por uma chave sem destruir uma ordenação anterior. O merge sort é estável; o quick sort comum não é.

Estudar a aula: Escolher o algoritmo certo

Módulo 10: Memoização e a ideia da programação dinâmica

Questão 36 · aula Recalcular à toa: o Fibonacci ingênuo

Por que o cálculo de fib de 5 pela função recursiva ingênua faz tanto trabalho repetido?

  1. Porque a função tem um erro de lógica que a faz travar.
  2. Porque cada chamada abre duas novas e valores como fib de 3 e fib de 2 são recalculados do zero em galhos diferentes, sem que nada seja guardado entre uma chamada e outra.
  3. Porque a recursão sempre é mais lenta que qualquer laço, em todos os casos.
  4. Porque a sequência de Fibonacci não pode ser calculada por computador.
Ver a resposta

Resposta: B. Porque cada chamada abre duas novas e valores como fib de 3 e fib de 2 são recalculados do zero em galhos diferentes, sem que nada seja guardado entre uma chamada e outra.

A função está correta. O desperdício vem de recalcular os mesmos subproblemas: fib de 3 é achado por vários galhos, cada um do zero, porque a função não guarda o que já descobriu. É esse recálculo redundante que explode o número de chamadas.

Estudar a aula: Recalcular à toa: o Fibonacci ingênuo

Questão 37 · aula Memoização: anotar para não recalcular

O que a função memoizada faz ANTES de calcular fib de n?

  1. Apaga a tabela para começar do zero.
  2. Consulta a tabela (cache) para ver se o resultado de n já foi calculado e, se já, devolve o valor guardado sem recalcular.
  3. Recalcula todos os valores anteriores por garantia.
  4. Troca a fórmula do Fibonacci por outra.
Ver a resposta

Resposta: B. Consulta a tabela (cache) para ver se o resultado de n já foi calculado e, se já, devolve o valor guardado sem recalcular.

O ritual da memoização é: antes de calcular, olhar o cache. Se a resposta para n já está lá, devolve na hora. Só quando não está é que a função calcula, anota o resultado na tabela e então devolve. É essa consulta que elimina o recálculo redundante.

Estudar a aula: Memoização: anotar para não recalcular

Questão 38 · aula Subproblemas sobrepostos: a marca que pede a técnica

Qual característica de um problema indica que memoização e programação dinâmica vão ajudar?

  1. O problema ser resolvido por recursão, qualquer que seja.
  2. Os mesmos subproblemas menores reaparecerem muitas vezes (subproblemas sobrepostos), com a resposta do todo se montando a partir das partes.
  3. O problema envolver números grandes.
  4. O problema poder ser resolvido com um único laço.
Ver a resposta

Resposta: B. Os mesmos subproblemas menores reaparecerem muitas vezes (subproblemas sobrepostos), com a resposta do todo se montando a partir das partes.

A marca é a repetição: quando o problema, ao ser quebrado, esbarra nos mesmos pedaços de novo e de novo, guardar esses pedaços numa tabela corta o trabalho repetido. Junte a isso a subestrutura ótima (o todo montado a partir das partes) e você tem um caso clássico de memo e DP. Só ser recursivo não basta.

Estudar a aula: Subproblemas sobrepostos: a marca que pede a técnica

Questão 39 · aula A ideia da programação dinâmica: de baixo para cima

Qual a diferença central entre a memoização e a programação dinâmica de baixo para cima?

  1. A memoização dá respostas diferentes da programação dinâmica.
  2. A memoização parte do problema grande e desce guardando resultados; a versão de baixo para cima começa pelos casos pequenos e sobe preenchendo uma tabela, sem recursão.
  3. A programação dinâmica não usa tabela nenhuma.
  4. A memoização só funciona com o Fibonacci e a programação dinâmica com qualquer problema.
Ver a resposta

Resposta: B. A memoização parte do problema grande e desce guardando resultados; a versão de baixo para cima começa pelos casos pequenos e sobe preenchendo uma tabela, sem recursão.

As duas cortam o mesmo desperdício e chegam ao mesmo resultado; mudam a direção. A memoização desce a partir do caso grande e guarda o que acha na volta. A programação dinâmica de baixo para cima começa pelos casos base já conhecidos e vai preenchendo a tabela em direção ao caso maior, com um laço, sem recursão.

Estudar a aula: A ideia da programação dinâmica: de baixo para cima

Módulo 11: Tabelas hash: o dicionário por dentro

Questão 40 · aula A tabela hash: o dicionário por dentro

Numa tabela hash, qual é o papel da função hash?

  1. Ordenar os valores do menor para o maior antes de guardar.
  2. Transformar a chave num índice do vetor, para a estrutura ir direto àquela posição.
  3. Percorrer a coleção inteira comparando a chave com cada item.
  4. Guardar apenas chaves numéricas, nunca chaves de texto.
Ver a resposta

Resposta: B. Transformar a chave num índice do vetor, para a estrutura ir direto àquela posição.

A função hash é a ponte entre a chave e a posição: recebe a chave (texto, número, o que for) e devolve um índice válido do vetor. Assim, guardar e buscar viram um cálculo direto, sem varrer a coleção.

Estudar a aula: A tabela hash: o dicionário por dentro

Questão 41 · aula A função hash: espalhar bem as chaves

Por que a distribuição uniforme é importante numa função hash?

  1. Porque deixa os itens em ordem alfabética dentro do vetor.
  2. Porque espalha as chaves por posições variadas, mantendo poucos itens por balde e a busca rápida.
  3. Porque faz a mesma chave cair em posições diferentes a cada busca.
  4. Porque reduz a quantidade de memória usada pela estrutura.
Ver a resposta

Resposta: B. Porque espalha as chaves por posições variadas, mantendo poucos itens por balde e a busca rápida.

Uniformidade significa espalhar as chaves de forma equilibrada, sem amontoar muitas no mesmo balde. Com poucos itens por posição, olhar dentro de um balde é rápido. Se a função concentra tudo em poucos baldes, a busca volta a ficar lenta.

Estudar a aula: A função hash: espalhar bem as chaves

Questão 42 · aula Colisões: quando duas chaves querem o mesmo balde

No tratamento de colisão por encadeamento, o que fica guardado em cada balde do vetor?

  1. Apenas um único par chave-valor, sempre.
  2. Uma lista com todos os pares cujas chaves caíram naquele índice.
  3. O índice do próximo balde livre a ser usado.
  4. Uma cópia da função hash usada pela tabela.
Ver a resposta

Resposta: B. Uma lista com todos os pares cujas chaves caíram naquele índice.

No encadeamento, cada balde guarda uma lista. Quando duas chaves colidem no mesmo índice, ambas entram na lista daquele balde. Buscar é ir ao balde e percorrer sua lista curta comparando as chaves, sem perder nenhum item.

Estudar a aula: Colisões: quando duas chaves querem o mesmo balde

Questão 43 · aula Por que a busca é quase instantânea

Por que a busca por chave numa tabela hash é considerada O(1) em média?

  1. Porque a tabela mantém os itens ordenados e usa busca binária.
  2. Porque a função calcula o índice e a estrutura vai direto ao balde, sem varrer a coleção, então o custo quase não cresce com o tamanho.
  3. Porque o computador guarda tudo na memória mais rápida disponível.
  4. Porque a tabela nunca tem colisões, então cada balde tem um item só.
Ver a resposta

Resposta: B. Porque a função calcula o índice e a estrutura vai direto ao balde, sem varrer a coleção, então o custo quase não cresce com o tamanho.

O cálculo do índice leva direto ao balde sem olhar os outros itens, então o número de passos quase não depende de quantos pares a tabela guarda. Isso é o tempo constante, O(1) em média. Vale em média porque colisões e lotação podem tornar buscas específicas mais lentas.

Estudar a aula: Por que a busca é quase instantânea

Módulo 12: Máquinas de estado: estados, transições e eventos

Questão 44 · aula Estados e transições: a situação que o sistema guarda

O que caracteriza uma máquina de estado?

  1. Um programa que guarda muitos números ao mesmo tempo.
  2. Um conjunto pequeno de situações possíveis (estados), estando sempre em uma delas, com regras (transições) que mudam de situação quando um evento acontece.
  3. Uma lista de instruções que roda uma vez, do começo ao fim, sem repetir.
  4. Uma estrutura de dados que ordena valores automaticamente.
Ver a resposta

Resposta: B. Um conjunto pequeno de situações possíveis (estados), estando sempre em uma delas, com regras (transições) que mudam de situação quando um evento acontece.

A máquina de estado tem estados (as situações possíveis), está sempre em exatamente um deles e usa transições (regras disparadas por eventos) para mudar de um estado para outro. É esse trio, estado atual mais evento decide o próximo estado, que define o modelo.

Estudar a aula: Estados e transições: a situação que o sistema guarda

Questão 45 · aula Modelar um semáforo: estado atual mais evento

No semáforo, por que o mesmo evento tempo esgotado leva a cores diferentes?

  1. Porque o evento muda de nome a cada vez.
  2. Porque o próximo estado depende do estado atual mais o evento, e não só do evento sozinho.
  3. Porque o semáforo escolhe a cor por sorteio.
  4. Porque o tempo de cada cor é sempre igual.
Ver a resposta

Resposta: B. Porque o próximo estado depende do estado atual mais o evento, e não só do evento sozinho.

A regra central da máquina de estado é que o destino de uma transição depende da dupla estado atual e evento. O evento tempo esgotado, aplicado no verde, leva ao amarelo; aplicado no amarelo, leva ao vermelho. O estado atual desambigua o evento.

Estudar a aula: Modelar um semáforo: estado atual mais evento

Questão 46 · aula Validar com uma máquina: a entrada como autômato

Ao validar um texto com um autômato de estados, como se decide se a entrada é válida?

  1. Conta-se o número de caracteres do texto.
  2. Lê-se o texto símbolo por símbolo mudando de estado e, ao fim, verifica-se se parou num estado de aceitação.
  3. Verifica-se apenas o primeiro caractere.
  4. Soma-se o valor de cada caractere e compara-se com um limite.
Ver a resposta

Resposta: B. Lê-se o texto símbolo por símbolo mudando de estado e, ao fim, verifica-se se parou num estado de aceitação.

No autômato, cada caractere lido dispara uma transição. Quando a leitura termina, olha-se o estado em que a máquina parou: se for um estado de aceitação (final), a entrada casa com o padrão e é válida; caso contrário, é rejeitada. O veredito vem do estado final, não de contar ou somar caracteres.

Estudar a aula: Validar com uma máquina: a entrada como autômato

Questão 47 · aula O jogo como máquina de estado: telas e eventos

Num jogo modelado como máquina de estado, o que são as telas (menu, jogando, pausa, fim) e o que são ações como apertar pausa?

  1. As telas são eventos e as ações são estados.
  2. As telas são estados (situações onde o jogo permanece) e as ações são eventos que disparam transições entre elas.
  3. Tanto as telas quanto as ações são estados.
  4. Nenhuma das duas coisas faz parte de uma máquina de estado.
Ver a resposta

Resposta: B. As telas são estados (situações onde o jogo permanece) e as ações são eventos que disparam transições entre elas.

As telas são estados: lugares onde o jogo permanece e se comporta de um jeito próprio. As ações do jogador, como apertar pausa ou perder, são eventos que disparam as transições entre as telas. Guardar a tela atual numa variável e reagir só aos eventos válidos ali é o que organiza a lógica da interface.

Estudar a aula: O jogo como máquina de estado: telas e eventos

Módulo 13: Abstração e modularidade: código que dura

Questão 48 · aula Dividir o programa em módulos

O que significa dizer que um módulo tem uma responsabilidade única?

  1. Que ele só pode ter uma linha de código.
  2. Que ele cuida de um assunto só, logo tem um motivo só para mudar.
  3. Que ele nunca pode ser chamado por outro módulo.
  4. Que ele precisa calcular e mostrar na tela ao mesmo tempo.
Ver a resposta

Resposta: B. Que ele cuida de um assunto só, logo tem um motivo só para mudar.

Responsabilidade única quer dizer que o módulo trata de uma coisa e, por isso, tem um motivo só para ser alterado. Se ele calcula e também desenha a tela, uma mudança de aparência arrisca a conta. Separar dá a cada parte um trabalho, uma fronteira e testes independentes.

Estudar a aula: Dividir o programa em módulos

Questão 49 · aula Interface e implementação: usar sem saber o como

Por que esconder a implementação atrás de uma interface deixa o código mais fácil de manter?

  1. Porque assim o módulo fica com menos linhas de código no total.
  2. Porque, se ninguém de fora depende do como interno, você pode trocar a implementação sem quebrar quem usa a interface.
  3. Porque a interface faz o programa rodar mais rápido automaticamente.
  4. Porque esconder o código impede qualquer erro de acontecer.
Ver a resposta

Resposta: B. Porque, se ninguém de fora depende do como interno, você pode trocar a implementação sem quebrar quem usa a interface.

Quando quem usa depende só da interface, o autor tem liberdade para mudar o interior (deixar mais rápido, corrigir, trocar a estrutura) sem afetar o resto do programa. Essa liberdade some quando a implementação vaza e alguém passa a depender de um detalhe interno.

Estudar a aula: Interface e implementação: usar sem saber o como

Questão 50 · aula Acoplamento e coesão: a saúde de um módulo

Um módulo chamado utilidades reúne uma função de formatar data, uma de enviar e-mail e uma de calcular desconto. Qual é o problema?

  1. Nenhum, juntar tudo num lugar só é sempre melhor.
  2. Ele tem baixa coesão: mistura assuntos que não têm relação entre si, o que dificulta entender e mudar.
  3. Ele tem acoplamento demais com ele mesmo.
  4. O nome utilidades faz o código rodar mais devagar.
Ver a resposta

Resposta: B. Ele tem baixa coesão: mistura assuntos que não têm relação entre si, o que dificulta entender e mudar.

Data, e-mail e desconto são assuntos diferentes, então juntá-los num módulo só dá baixa coesão: uma gaveta de bagunça sem foco. O certo é separar por assunto, deixando cada módulo focado (alta coesão) e fácil de nomear e de encontrar.

Estudar a aula: Acoplamento e coesão: a saúde de um módulo

Questão 51 · aula Invariantes: a promessa que o código mantém

Por que nomear a invariante de uma estrutura ajuda a encontrar bugs?

  1. Porque deixa o código mais curto.
  2. Porque permite escrever um teste que confere, após cada operação, se a promessa continua verdadeira, apontando o bug onde ele nasce.
  3. Porque impede que a estrutura seja usada por outros módulos.
  4. Porque faz a estrutura ocupar menos memória.
Ver a resposta

Resposta: B. Porque permite escrever um teste que confere, após cada operação, se a promessa continua verdadeira, apontando o bug onde ele nasce.

Com a invariante nomeada, você escreve uma função que a verifica e a chama depois de cada operação nos testes. Se a promessa for quebrada, o bug é flagrado exatamente onde surgiu, em vez de aparecer confuso e distante, como sintoma, mais tarde.

Estudar a aula: Invariantes: a promessa que o código mantém

Módulo 14: Imutabilidade e efeitos: código previsível

Questão 52 · aula Mutável ou imutável: mudar no lugar ou copiar

Por que dado mutável compartilhado entre vários trechos costuma gerar bugs difíceis de achar?

  1. Porque dado mutável ocupa mais memória que dado imutável.
  2. Porque um trecho pode alterar o dado no lugar e os outros, que apontam para o mesmo dado, passam a ver a mudança sem terem sido avisados.
  3. Porque dado mutável não pode ser lido, apenas escrito.
  4. Porque a linguagem apaga o dado toda vez que ele é alterado.
Ver a resposta

Resposta: B. Porque um trecho pode alterar o dado no lugar e os outros, que apontam para o mesmo dado, passam a ver a mudança sem terem sido avisados.

Quando vários trechos apontam para o mesmo dado mutável, uma alteração num ponto muda o dado para todos. Quem não fez a alteração continua achando que o valor é o antigo e erra. A causa fica longe do efeito, o que torna o bug penoso de rastrear. Tratar o dado como imutável evita isso, porque qualquer mudança vira um objeto novo e separado.

Estudar a aula: Mutável ou imutável: mudar no lugar ou copiar

Questão 53 · aula Função pura a fundo: só entra e sai

Quais são as duas exigências para uma função ser considerada pura?

  1. Ser curta e ter um nome descritivo.
  2. Depender apenas dos argumentos recebidos e não causar nenhum efeito no mundo externo.
  3. Usar apenas números e nunca textos.
  4. Ser chamada uma única vez em todo o programa.
Ver a resposta

Resposta: B. Depender apenas dos argumentos recebidos e não causar nenhum efeito no mundo externo.

Pureza tem duas regras. Primeira: o resultado depende só dos argumentos, sem espiar variável global, relógio ou aleatório. Segunda: nenhum efeito externo, ou seja, não salva, não imprime, não muda nada por fora. Juntas, garantem que a mesma entrada sempre gera a mesma saída, o que a torna previsível e fácil de testar.

Estudar a aula: Função pura a fundo: só entra e sai

Questão 54 · aula Efeito colateral controlado: isolar na borda

O que significa isolar os efeitos colaterais na borda do sistema?

  1. Apagar todos os efeitos colaterais do programa, deixando só funções puras.
  2. Concentrar a lógica que decide em funções puras (o núcleo) e deixar os efeitos, como salvar e imprimir, numa camada fina em volta que apenas executa.
  3. Colocar todos os efeitos no início do programa e nunca mais usá-los.
  4. Transformar cada efeito colateral em uma variável global.
Ver a resposta

Resposta: B. Concentrar a lógica que decide em funções puras (o núcleo) e deixar os efeitos, como salvar e imprimir, numa camada fina em volta que apenas executa.

Isolar na borda é o padrão de núcleo puro com casca impura: a decisão fica em funções puras e testáveis, e os efeitos ficam numa camada fina que só executa o que o núcleo decidiu. Não se trata de eliminar efeitos, que são necessários, mas de mantê-los confinados num lugar pequeno e previsível, longe da lógica.

Estudar a aula: Efeito colateral controlado: isolar na borda

Questão 55 · aula Previsibilidade e concorrência: rodar em paralelo

Por que código puro e dados imutáveis facilitam rodar tarefas em paralelo com segurança?

  1. Porque tornam o programa mais curto e ele roda mais rápido por isso.
  2. Porque a condição de corrida precisa de dado compartilhado sendo alterado, e sem mutação nem estado compartilhado não há o que disputar entre as tarefas.
  3. Porque impedem que o programa use mais de um núcleo do processador.
  4. Porque forçam as tarefas a rodarem uma de cada vez, em fila.
Ver a resposta

Resposta: B. Porque a condição de corrida precisa de dado compartilhado sendo alterado, e sem mutação nem estado compartilhado não há o que disputar entre as tarefas.

A condição de corrida exige dois ingredientes: dado compartilhado e mutação. Dado imutável pode ser lido por muitas tarefas ao mesmo tempo sem risco, porque ninguém o altera. Função pura não toca em estado externo, então não pisa no dado das outras. Sem dado mutável compartilhado, não há disputa, e o paralelo fica seguro.

Estudar a aula: Previsibilidade e concorrência: rodar em paralelo

Módulo 15: Projeto final: Mapa de Rotas

Questão 56 · aula O projeto: Mapa de Rotas

No projeto Mapa de Rotas de um metrô, qual é a modelagem correta como grafo?

  1. Cada trilho é um vértice e cada estação é uma aresta.
  2. Cada estação é um vértice e cada trecho que liga duas estações vizinhas é uma aresta.
  3. Todo o mapa é um único vértice, sem arestas.
  4. As cores das linhas do metrô são os vértices.
Ver a resposta

Resposta: B. Cada estação é um vértice e cada trecho que liga duas estações vizinhas é uma aresta.

Os pontos de interesse (as estações) são os vértices; as ligações diretas entre eles (os trechos de trilho) são as arestas. Essa modelagem guarda a rede como lista de adjacência e prepara o grafo para o algoritmo de caminho.

Estudar a aula: O projeto: Mapa de Rotas

Questão 57 · aula Achar o menor caminho com busca em largura

Por que a busca em largura encontra o menor caminho em número de passos?

  1. Porque ela testa todos os caminhos possíveis e compara os tamanhos no final.
  2. Porque explora por camadas com uma fila, então a primeira vez que alcança um ponto é sempre pela rota mais curta em passos.
  3. Porque ela sempre escolhe o trecho fisicamente mais curto.
  4. Porque usa duas pilhas em vez de uma fila.
Ver a resposta

Resposta: B. Porque explora por camadas com uma fila, então a primeira vez que alcança um ponto é sempre pela rota mais curta em passos.

A fila faz a busca esgotar cada camada de distância antes de avançar para a próxima. Assim, quando um vértice é alcançado pela primeira vez, foi pelo caminho com menos passos; qualquer rota mais longa chegaria mais tarde, quando ele já estivesse visitado.

Estudar a aula: Achar o menor caminho com busca em largura

Questão 58 · aula Montando o programa completo

Como o programa reconstrói a lista de pontos do caminho, e não apenas descobre a distância?

  1. Guardando o pai de cada vértice descoberto e seguindo os país do destino até a origem.
  2. Somando os índices de todos os vértices visitados.
  3. Ordenando os vértices em ordem alfabética no final.
  4. Escolhendo aleatoriamente um vizinho a cada passo.
Ver a resposta

Resposta: A. Guardando o pai de cada vértice descoberto e seguindo os país do destino até a origem.

Ao descobrir um vizinho, a busca anota de quem ele veio (o pai). No fim, partindo do destino e seguindo pai por pai até a origem, obtém-se a sequência do caminho de trás para frente; invertendo, tem-se a rota completa.

Estudar a aula: Montando o programa completo

Questão 59 · aula Do pseudocódigo à linguagem

Por que quem domina a lógica de programação costuma aprender linguagens novas com mais facilidade?

  1. Porque todas as linguagens usam exatamente a mesma sintaxe.
  2. Porque a lógica (decisões, laços, estruturas, algoritmos) é a parte que se transfere entre linguagens; muda só a sintaxe.
  3. Porque não é preciso praticar depois de aprender lógica.
  4. Porque a lógica dispensa o uso de qualquer linguagem.
Ver a resposta

Resposta: B. Porque a lógica (decisões, laços, estruturas, algoritmos) é a parte que se transfere entre linguagens; muda só a sintaxe.

O raciocínio algorítmico (como resolver o problema) é o mesmo em qualquer linguagem. O que muda de uma para outra é a sintaxe, a forma de escrever. Por isso, com a lógica sólida, aprender uma linguagem nova vira sobretudo aprender uma nova forma de escrever ideias que você já entende.

Estudar a aula: Do pseudocódigo à linguagem

Terminou a lista?

Quem acertou quase tudo já pode encarar o exame final do curso, com 20 questões sorteadas e aprovação a partir de 70%. Quem errou bastante ganha mais voltando às aulas dos módulos em que tropeçou: cada questão acima leva direto à aula certa.

Ir para o Curso de Lógica de Programação Avançado