BSI · IFBA · Feira de Santana 2005 – 2023 · 83 questões

ENADE — Algoritmos
e Estruturas de Dados

Compilação de 83 questões do Exame Nacional de Desempenho dos Estudantes (ENADE) das edições de 2005, 2008, 2011, 2014, 2017, 2019, 2021 e 2023, organizadas por tema para facilitar o estudo por conteúdo.

Por que estudar pelo ENADE?

O ENADE avalia o desempenho dos estudantes ao final do curso em relação aos conteúdos programáticos, competências e habilidades previstas nas Diretrizes Curriculares Nacionais. Conhecer as questões anteriores é uma das estratégias mais eficazes para identificar os temas prioritários e o nível de profundidade exigido pelo exame.

Esta página reúne 83 questões de 8 edições do ENADE (2005–2023) que envolvem Algoritmos e Estruturas de Dados, organizadas em 8 capítulos temáticos — conteúdo central das disciplinas de Estruturas de Dados e Linguagem de Programação I do BSI no IFBA.

Cada questão traz identificação da edição, tipo (objetiva ou discursiva) e gabarito oficial com comentário explicativo.

Baixar PDF original

1
Estruturas de dados lineares: listas, pilhas e filas
Pilhas Filas Listas encadeadas TDA
Q1 ENADE 2014 – Ciência da Computação (Bach.) – Questão 16
Objetiva
Considere o código C abaixo, que implementa uma pilha com vetor estático:
struct Pilha { int elementos[100]; int topo; };
void push(struct Pilha *p, int v) { p->elementos[p->topo++] = v; }
int  pop (struct Pilha *p)       { return p->elementos[--p->topo]; }
int main() {
    struct Pilha *p = (struct Pilha*) malloc(sizeof(struct Pilha));
    p->topo = 0;
    push(p,2); push(p,3); push(p,4);
    pop(p); push(p,2);
    int a = pop(p) + pop(p);  /* a = 2+3 = 5 */
    push(p, a);
    a += pop(p);              /* a = 5+5 = 10 */
    printf("%d\n", a);        /* imprime 10 */
    return 0;
}
Considere as afirmativas:
I. As operações push e pop têm complexidade O(1).
II. Substituindo int a = pop(p) + pop(p) por int a = pop(p); a += pop(p), o valor impresso seria o mesmo.
III. Como a pilha foi alocada com malloc, a chamada a free(p) ao final do main é opcional.
  • A I apenas.
  • B I e III.
  • C I e II.
  • D II e III.
  • E I, II e III.
Gabarito: C — I é correta: acesso direto ao vetor é O(1). II é correta: a=2+3=5 em ambas as formas, e ao final a=5+5=10. III é incorreta: malloc exige free para evitar memory leak.
Q2 ENADE 2017 – Ciência da Computação (Bach./Lic.) – Discursiva 3
Discursiva
Considere a estrutura de lista simplesmente encadeada e a função recursiva abaixo:
struct ListaEncadeada {
    int dado;
    struct ListaEncadeada *proximo;
};
void mostrar(struct ListaEncadeada *lista) {
    if (lista == NULL) return;
    mostrar(lista->proximo);
    printf("%d\n", lista->dado);
}
a) Determine a complexidade de tempo da função mostrar em função do número N de elementos da lista, justificando sua resposta.
b) Reescreva mostrar de forma não-recursiva, utilizando uma estrutura de pilha auxiliar para obter a mesma saída (elementos em ordem inversa da lista).
Gabarito: Discursiva — a) Complexidade Θ(N): a função visita cada nó exatamente uma vez. b) Versão não-recursiva: empilha todos os nós percorrendo a lista do início ao fim; depois desempilha imprimindo cada dado. Pseudocódigo aceito ou código em C/Java.
Q3 ENADE 2017 – Sistemas de Informação – Questão 35
Objetiva
Um comitê olímpico registra os recordes mundiais em uma estrutura de dados na ordem cronológica em que são estabelecidos. A principal operação de consulta é recuperar o recorde mais recente primeiro. Qual estrutura de dados é a mais adequada para implementar essa funcionalidade?
  • A Deque (fila de duas extremidades).
  • B Fila (FIFO — primeiro a entrar, primeiro a sair).
  • C Pilha (LIFO — último a entrar, primeiro a sair).
  • D Fila de prioridade invertida.
  • E Lista circular.
Gabarito: C — O recorde mais recente é o último inserido; recuperá-lo primeiro corresponde ao comportamento LIFO da pilha.
Q4 ENADE 2021 – Ciência da Computação (Bach./Lic.) – Questão 10
Objetiva
Uma biblioteca Java oferece as seguintes interfaces/classes para estruturas de dados:
Classe A — permite inserção e remoção nas duas extremidades;
Classe B — cada nó armazena uma referência apenas para o próximo elemento;
Classe C — remove elementos na ordem inversa à de inserção;
Classe D — remove sempre o elemento inserido há mais tempo.
Quais são, respectivamente, as estruturas que correspondem às classes A, B, C e D?
  • A Lista circular, lista simplesmente ligada, pilha, fila.
  • B Deque, lista simplesmente ligada, pilha, fila.
  • C Lista duplamente ligada, lista simplesmente ligada, fila, pilha.
  • D Pilha, fila, deque, lista simplesmente ligada.
  • E Deque, pilha, lista ligada, fila.
Gabarito: B — Deque: inserção/remoção em ambas as extremidades; lista simplesmente ligada: referência somente ao próximo; pilha: LIFO (remoção na ordem inversa); fila: FIFO (remove o mais antigo).
Q5 ENADE 2021 – Tecnologia em ADS – Discursiva 5
Discursiva
Um sistema hospitalar de triagem utiliza o código C abaixo para gerenciar uma fila com prioridade baseada na cor do cartão (A = amarelo, V = verde):
struct lista { int numero; char cor; struct lista *prox; };

void inserir_fim(struct lista **inicio, int num, char c) { /* insere no fim */ }

void inserir(struct lista **inicio, int num, char cor) {
    if (cor == 'V') inserir_fim(inicio, num, cor);
    else            inserir_prioridade(inicio, num, cor);
}
As chegadas são: 10-V, 11-V, 5-A, 12-V, 6-A. Após todas as inserções a fila deve ser: [5, 6, 10, 11, 12].
Implemente a função inserir_prioridade para pacientes amarelos, que devem ser inseridos após o último amarelo já na fila (antes dos verdes).
Gabarito: Discursiva — inserir_prioridade: cria novo nó; se lista vazia ou primeiro nó é verde, insere no início; caso contrário, percorre a lista enquanto o próximo nó também for amarelo ('A'), então insere após o último amarelo. Complexidade O(n). Padrão INEP disponível na prova oficial.
Q6 ENADE 2023 – Engenharia de Computação – Questão 15
Objetiva
Considere as implementações em C a seguir. Qual delas provoca memory leak (vazamento de memória)?
/* A */ char *f(){ char *s=malloc(10); strcpy(s,"ok"); free(s); return NULL; }
/* B */ void g(){ float x; x=3.14; }
/* C */ int h(char *data){ char *s=malloc(60);
         if(strlen(data)>50){ return -1; } /* free(s) nunca chamado */
         strcpy(s,data); free(s); return 0; }
/* D */ char *k(){ char *s=malloc(20); return s; } /* chamador libera */
/* E */ void m(){ char *s=malloc(8); free(s); free(s); } /* double free */
  • A Função A — aloca e libera corretamente.
  • B Função B — variável local, sem alocação dinâmica.
  • C Função C — retorna -1 antes de free(s) quando strlen(data) > 50, causando vazamento.
  • D Função D — transfere a responsabilidade da liberação ao chamador.
  • E Função E — double free é erro de uso após liberação, não memory leak.
Gabarito: C — Quando strlen(data) > 50, a função retorna -1 sem executar free(s); o bloco alocado por malloc(60) nunca é liberado, causando memory leak.
Q7 ENADE 2023 – Engenharia de Computação – Questão 33
Objetiva
Um controlador PID calcula: termo proporcional Kp·e(t), termo integral Ki·∑e(t) e termo derivativo Kd·Δe(t). Analise as afirmativas sobre as estruturas de dados adequadas para cada termo:
I. Para o termo integral, é necessária uma fila para armazenar o histórico completo de erros.
II. O termo proporcional é calculado diretamente como Kp·e(t), sem necessidade de estrutura de dados adicional.
III. Para o termo derivativo, uma pilha contendo as duas amostras de erro mais recentes é adequada.
  • A I apenas.
  • B II apenas.
  • C I e III.
  • D II e III.
  • E I, II e III.
Gabarito: D — I é incorreta: o integral acumula numa variável simples (soma corrente), não precisa de fila. II é correta: Kp·e(t) usa apenas o erro atual. III é correta: a derivada discreta usa só as duas amostras mais recentes, que uma pilha de tamanho 2 armazena eficientemente.
Q8 ENADE 2011 – Ciência da Computação – Questão 39
Objetiva
Analise as afirmativas sobre Tipos Abstratos de Dados (TDA):
I. A especificação de um TDA deve incluir detalhes sobre a representação interna dos dados.
II. Em linguagens orientadas a objetos, um TDA pode ser implementado por meio de composição ou herança.
III. Se o TDA S pode ser substituído pelo TDA T em qualquer contexto, então S é subtipo de T.
IV. O encapsulamento fornecido por um TDA tem efeito positivo sobre a modularidade e a manutenibilidade do software.
  • A I apenas.
  • B II apenas.
  • C I e III.
  • D II e IV.
  • E III e IV.
Gabarito: D — I é incorreta: TDA separa especificação da implementação, ocultando a representação interna. II é correta: OO permite ambas as formas. III é incorreta: o Princípio da Substituição de Liskov diz que T (supertipo) pode ser substituído por S (subtipo), não o contrário. IV é correta: encapsulamento reduz acoplamento e facilita manutenção.
Q9 ENADE 2011 – Computação (todas as áreas) – Questão 21
Objetiva
Uma sequência de caracteres de DNA A,G,T,C,A,G,T,T é inserida, um a um, em uma Estrutura 1. Os elementos são retirados da Estrutura 1 e inseridos em uma Estrutura 2; obtendo-se a sequência T,T,G,A,C,T,G,A. Os elementos são retirados da Estrutura 2 obtendo-se novamente T,T,G,A,C,T,G,A. Quais são, respectivamente, as Estruturas 1, 2 e o tipo de leitura final?
  • A Fila – Pilha – Fila.
  • B Fila – Fila – Pilha.
  • C Fila – Pilha – Pilha.
  • D Pilha – Fila – Pilha.
  • E Pilha – Pilha – Pilha.
Gabarito: A — Estrutura 1 = Fila (FIFO): guarda a ordem original A,G,T,C,A,G,T,T. Ao transferir para a Estrutura 2 = Pilha (LIFO): inverte para T,T,G,A,C,T,G,A. Ao retirar da Estrutura 2 com Fila (FIFO): mantém a ordem T,T,G,A,C,T,G,A.
Q10 ENADE 2011 – Tecnologia em ADS – Questão 29
Objetiva
Sobre uma pilha p inicialmente vazia, são executadas as seguintes operações na ordem indicada:
PUSH(p,10), PUSH(p,5), PUSH(p,3), PUSH(p,40), POP(p), PUSH(p,11), PUSH(p,4), PUSH(p,7), POP(p), POP(p).
Após essas operações, qual é o valor do elemento no topo e qual é a soma de todos os elementos restantes na pilha?
  • A Topo = 11 e Soma = 29.
  • B Topo = 11 e Soma = 80.
  • C Topo = 4 e Soma = 80.
  • D Topo = 7 e Soma = 29.
  • E Topo = 7 e Soma = 40.
Gabarito: A — Rastreamento: após todas as operações a pilha contém [10, 5, 3, 11] (base→topo). POP remove 40, 7 e 4; PUSH insere 11, 4, 7. Topo = 11; Soma = 10+5+3+11 = 29.
2
Árvores e heaps
ABB / ABP AVL Heaps binários Percursos
Q11 ENADE 2014 – Ciência da Computação (Bach.) – Questão 13
Objetiva
A figura mostra uma Árvore Binária de Pesquisa (ABP) com raiz 15: subárvore esquerda com raiz 10 (filhos 7 e 13; 13 tem filho direito 14) e subárvore direita com raiz 20 (filhos 17 e 25). Analise as afirmativas:
I. A ABP permite busca eficiente de forma análoga à busca binária em vetor ordenado.
II. A árvore está desbalanceada porque possui número ímpar de nós.
III. O percurso pós-ordem produz os elementos em ordem decrescente.
IV. A complexidade de busca nessa árvore é O(log n) no caso médio.
  • A I e III.
  • B I e IV.
  • C II e III.
  • D I, II e IV.
  • E II, III e IV.
Gabarito: B — I é correta: busca em ABP segue o mesmo princípio da busca binária. II é incorreta: balanceamento mede-se pela diferença de alturas das subárvores, não pelo número de nós. III é incorreta: pós-ordem não produz necessariamente ordem decrescente. IV é correta: O(log n) no caso médio (árvore balanceada).
Q12 ENADE 2017 – Ciência da Computação (Bach./Lic.) – Questão 9
Objetiva
Considere a árvore AVL com raiz 13: filho esquerdo 10 (com filhos 5 e 11; 5 tem filhos 4 e 8) e filho direito 15 (com filho direito 16). Após inserir a chave 3 (filho esquerdo de 4), ocorre desbalanceamento. Qual das opções representa corretamente a árvore AVL após a rotação necessária?
  • A Raiz=13; esq=5 (filhos: 4→{3}, 10→{8,11}); dir=15→{16}.
  • B Raiz=10; esq=5→{3,8}; dir=13→{11,15→{16}}.
  • C Raiz=5; esq=4→{3}; dir=13→{10→{8,11},15→{16}}.
  • D Raiz=13; esq=4 (filhos: 3, 5→{8,10→{11}}); dir=15→{16}.
  • E Raiz=10; esq=4→{3,5→{8}}; dir=13→{11,15→{16}}.
Gabarito: A — Desequilíbrio esquerda-esquerda no nó 10 (fator = −2). Rotação simples à direita em torno do 10: o nó 5 sobe como filho esquerdo de 13; 10 desce como filho direito de 5, recebendo 8 como filho esquerdo.
Q13 ENADE 2021 – Ciência da Computação (Bach./Lic.) – Questão 23
Objetiva
Uma árvore binária de busca (ABB) é construída com a inserção das chaves na seguinte ordem: 27, 34, 40, 18, 23, 5, 25, 36, 10, 7, −2. Analise as afirmativas sobre a árvore resultante:
A) A árvore possui 5 níveis e 6 nós na subárvore esquerda da raiz principal.
B) O percurso pré-ordem produz: −2, 7, 10, 5, 25, 23, 18, 36, 40, 34, 27.
C) O percurso em-ordem produz: −2, 5, 7, 10, 18, 23, 25, 27, 34, 36, 40.
D) O percurso pré-ordem produz os elementos em ordem crescente.
E) Uma árvore binária de 10 níveis pode armazenar no máximo 1 023 nós.
  • A Apenas A.
  • B Apenas B.
  • C Apenas C.
  • D Apenas D.
  • E Apenas E.
Gabarito: C — O percurso em-ordem (esquerda–raiz–direita) em uma ABB sempre produz as chaves em ordem crescente. As demais afirmativas são incorretas: B descreve o pós-ordem, D só é verdade para em-ordem, E refere-se a 2¹⁰−1 = 1 023 nós em árvore completa de altura 10.
Q14 ENADE 2021 – Ciência da Computação (Bach.) – Discursiva 5
Discursiva
O código C a seguir implementa as funções heapify e buildHeap para max-heap:
void heapify(int v[], int n, int i) {
    int maior = i, esq = 2*i+1, dir = 2*i+2;
    if (esq < n && v[esq] > v[maior]) maior = esq;
    if (dir < n && v[dir] > v[maior]) maior = dir;
    if (maior != i) { int t=v[i]; v[i]=v[maior]; v[maior]=t;
                      heapify(v, n, maior); }
}
void buildHeap(int v[], int n) {
    for (int i = n/2-1; i >= 0; i--) heapify(v, n, i);
}
Dado o vetor {2, 5, 8, 13, 21, 1, 3, 34}:
a) Execute buildHeap e mostre o vetor resultante (max-heap).
b) Determine a complexidade de tempo de heapify em função de n.
Gabarito: Discursiva — a) buildHeap({2,5,8,13,21,1,3,34}, 8) → {34,21,8,13,2,1,3,5} (max-heap). b) heapify percorre a altura da árvore, portanto O(log n). Padrão INEP disponível na prova oficial.
Q15 ENADE 2019 – Engenharia de Computação – Discursiva 3
Discursiva
Considere uma Árvore AVL inicialmente com os elementos {21, 2, 9, 15, 27, 36, 50}.
a) Construa a ABB balanceada resultante justificando a posição de cada elemento.
b) Insira as chaves 9, 27 e 50 nessa ordem em uma AVL vazia e descreva as rotações necessárias após cada inserção desequilibrante.
c) Insira as chaves 9, 27, 50, 15, 2, 21, 36 em uma AVL vazia; identifique o tipo de rotação dupla gerada e mostre a árvore resultante.
Gabarito: Discursiva — a) Raiz=21; sub-esq: {2,9,15}; sub-dir: {27,36,50}. b) Inserção de 50 após {9,27}: rotação simples à esquerda em 9, 27 vira raiz. c) Inserção de 36 após {2,9,15,21,27,50}: rotação dupla direita-esquerda, raiz resultante=15. Padrão INEP disponível na prova oficial.
Q16 ENADE 2008 – Computação (todas as áreas) – Questão 14
Objetiva
Considere o pseudocódigo abaixo para o percurso pré-ordem iterativo com pilha:
ptr ← raiz
enquanto ptr ≠ λ faça
    escreve ptr.chave
    se ptr.dir ≠ λ então push(ptr.dir)
    se ptr.esq ≠ λ então push(ptr.esq)
    ptr ← pop()
Analise as afirmativas:
I. O algoritmo visita cada nó da árvore exatamente uma vez.
II. Quando a pilha está vazia, pop() retorna λ, encerrando o laço.
III. As operações push e pop têm complexidade O(1).
IV. A complexidade de tempo do algoritmo é O(n).
  • A I apenas.
  • B I e IV.
  • C I, II e III.
  • D II, III e IV.
  • E I, II, III e IV.
Gabarito: E — I: cada nó é visitado e empilhado no máximo uma vez. II: pop de pilha vazia retorna λ, encerrando o laço. III: push/pop em pilha com vetor são O(1). IV: O(n) pois visita exatamente n nós.
Q17 ENADE 2011 – Computação (todas as áreas) – Questão 24
Objetiva
Sobre heaps binários usados como filas de prioridade para recuperação de informação, analise as afirmativas:
I. Um heap binário é uma Árvore Binária de Pesquisa (ABP); a complexidade de buildHeap é O(n log n).
II. Em um heap com n elementos armazenados em vetor, o pai do elemento na posição i está na posição 2i+1.
III. Extrair os m documentos de maior prioridade de um heap com n documentos custa O(m log n).
IV. Encontrar o elemento máximo em um max-heap custa O(1).
  • A I e II.
  • B II e III.
  • C III e IV.
  • D I, II e IV.
  • E I, III e IV.
Gabarito: C — I é incorreta: heap não é ABP (não há ordem entre irmãos); buildHeap é O(n). II é incorreta: o pai do elemento i está em ⌊(i−1)/2⌋. III é correta: cada extração custa O(log n); m extrações custam O(m log n). IV é correta: o máximo está sempre na raiz (posição 0).
Q18 ENADE 2011 – Computação (todas as áreas) – Questão 30
Objetiva
Em uma ABP são examinados os seguintes nós (em ordem) ao buscar a chave 287. Quais sequências são possíveis numa ABP válida?
I. 7, 342, 199, 201, 310, 258, 287
II. 110, 132, 133, 156, 289, 288, 287
III. 252, 266, 271, 294, 295, 289, 287
IV. 715, 112, 530, 249, 406, 234, 287
  • A Apenas I.
  • B Apenas III.
  • C I e II.
  • D II e IV.
  • E III e IV.
Gabarito: C — I é válida (sequência monotonicamente restrita até 287). II é válida (sempre aumentando em direção a 287 por caminhos consistentes). III é inválida: após 294 aparecer 295>294; como 287<294, devemos ir à esquerda onde não pode aparecer 295. IV é inválida: após 249 aparece 406 (vai à direita, correto), mas depois 234<249 contradiz o caminho.
Q19 ENADE 2011 – Computação (todas as áreas) – Discursiva 4
Discursiva
Dado um vetor ordenado v[1..n] com n = 2m−1 elementos, construa uma ABP perfeitamente balanceada a partir desse vetor sem comparações adicionais.
a) Defina a estrutura do nó em C (struct nodo).
b) Escreva a função recursiva CriaABP(v, i, j) que cria a ABP a partir do subvetor v[i..j], usando o elemento médio como raiz.
Gabarito: Discursiva — a) struct nodo { int chave; struct nodo *esq, *dir; }; b) pos=(i+j)/2; p->chave=v[pos]; if(i<j){ p->esq=CriaABP(v,i,pos-1); p->dir=CriaABP(v,pos+1,j); } else p->esq=p->dir=NULL; Chamada: raiz=CriaABP(v,1,n). Padrão INEP disponível na prova oficial.
Q20 ENADE 2005 – Computação (CC e SI) – Discursiva 39
Discursiva
Considere a árvore binária com raiz 33: filho esquerdo 15 e filho direito 41; 41 tem filhos 38 (com filho esquerdo 34) e 47 (com filhos 43 e 49).
a) Liste os nós visitados em DFS (busca em profundidade) a partir do nó 41.
b) Liste o percurso pré-ordem completo da árvore.
c) Insira o valor 21 na árvore como filho direito de 15; depois remova 47 (substituindo pelo sucessor em-ordem) e insira 48.
Gabarito: Discursiva — a) DFS de 41: 41, 38, 34, 47, 43, 49 (ou 41, 47, 49, 43, 38, 34 dependendo da ordem esq/dir). b) Pré-ordem: 33, 15, 41, 38, 34, 47, 43, 49. c) Inserir 21 à direita de 15; remover 47 substituindo por 49 (ou 43); inserir 48 como filho de 49. Padrão INEP disponível na prova oficial.
3
Tabelas de dispersão (hash)
Funções hash Tratamento de colisões Encadeamento
Q21 ENADE 2021 – Sistemas de Informação – Questão 33
Anulada
Uma tabela hash T possui 9 posições (índices 0 a 8) com encadeamento exterior e função h(k) = k mod 9. São realizadas as inserções: insere(13,6); insere(46,7); insere(20,22); insere(28,25); insere(19,26); insere(17,9). Analise as afirmativas sobre o estado da tabela após todas as inserções:
I. No índice 1: (46,7)→(28,25)→(19,26)→NULO.
II. No índice 2: (20,22)→NULO; no índice 4: (13,6)→NULO; no índice 8: (17,9)→NULO.
III. Nenhuma posição permanece completamente vazia.
IV. Todas as inserções produzem colisão.
  • A I e II.
  • B II e III.
  • C I e III.
  • D I, II e IV.
  • E III e IV.
Gabarito: ANULADA — A questão foi anulada pelo INEP pois nenhuma das alternativas apresentadas corresponde exatamente ao estado correto da tabela. Os cálculos: h(13)=4, h(46)=1, h(20)=2, h(28)=1, h(19)=1, h(17)=8; índice 1: (46,7)→(28,25)→(19,26)→NULO; índice 2: (20,22)→NULO; índice 4: (13,6)→NULO; índice 8: (17,9)→NULO — mas nenhuma alternativa na prova original descrevia isso corretamente.
Q22 ENADE 2008 – Computação (todas as áreas) – Discursiva 20
Discursiva
Uma tabela hash com 23 endereços utiliza h(x) = x mod 23 com encadeamento exterior. Insira as chaves na seguinte ordem: 44, 46, 49, 70, 27, 71, 90, 97, 95.
a) Identifique todos os pares de chaves que colidem (mesma posição na tabela).
b) Mostre o estado final da tabela indicando as listas em cada posição ocupada.
Gabarito: Discursiva — a) Colisões: {44,49,95,90} → h=21/0; {49,95}: h(49)=3, h(95)=3 → índice 3; verifique h(44)=44 mod 23=21, h(90)=90 mod 23=21; h(49)=3, h(95)=3. b) índice 0: [46]; índice 1: [70]; índice 2: [71]; índice 3: [49→95]; índice 4: [27]; índice 5: [97]; índice 21: [44→90]; demais vazios. Padrão INEP disponível na prova oficial.
4
Busca e ordenação
Busca binária Quicksort Mergesort Bubble / Insertion
Q23 ENADE 2014 – Sistemas de Informação – Discursiva 3
Discursiva
Pesquisa binária em vetor ordenado de n elementos:
a) Escreva o algoritmo de busca binária em pseudocódigo (versão iterativa), indicando claramente os índices extremos e o cálculo do meio.
b) Determine o número máximo de comparações em função de n e justifique usando análise de complexidade assintótica.
Gabarito: Discursiva — a) Iterativo: e=0; d=n-1; enquanto e<=d: m=(e+d)/2; se v[m]==x retorna m; se v[m]<x: e=m+1; senão d=m-1; retorna -1. b) Cada comparação divide o espaço pela metade: máximo ⌊log₂n⌋+1 comparações; complexidade O(log n). Padrão INEP disponível na prova oficial.
Q24 ENADE 2014 – Sistemas de Informação – Questão 10
Objetiva
Um arquivo texto contém N cidades, uma por linha, em ordem alfabética. Um programa lê o arquivo sequencialmente, linha a linha, para buscar uma cidade pelo nome. Qual é a complexidade de tempo dessa busca no pior caso?
  • A O(1) — acesso direto ao registro.
  • B O(N) — leitura linha a linha até encontrar ou encerrar o arquivo.
  • C O(log₂N) — exigiria estrutura de acesso aleatório em memória.
  • D O(N·log N) — custo de leitura e comparação.
  • E O(N²) — busca dupla no arquivo.
Gabarito: B — A busca sequencial em arquivo texto lê, no pior caso, todas as N linhas antes de concluir que o elemento não existe, custando O(N). A busca binária (O(log N)) exigiria acesso aleatório por posição, não disponível em arquivo texto linha a linha.
Q25 ENADE 2021 – Ciência da Computação (Bach./Lic.) – Questão 20
Objetiva
Considere o código C que define funcao1 (busca sequencial) e funcao2 (busca binária recursiva) em um vetor TAM=10: {1,3,5,7,9,11,13,15,17,19}. A chamada printf("%d - %d", funcao1(vetor,15), funcao2(vetor,15,0,TAM-1)) é executada. Analise:
I. O resultado impresso é 7 - 7 (índice do elemento 15 em ambas as funções).
II. Para esse vetor, funcao1 é mais eficiente que funcao2 no pior caso.
III. funcao2 é uma implementação iterativa.
  • A I apenas.
  • B II apenas.
  • C I e II.
  • D I e III.
  • E II e III.
Gabarito: A — I é correta: 15 está no índice 7 em ambas as buscas (resultado 7-7). II é incorreta: busca sequencial é O(n) e binária é O(log n); binária é mais eficiente no pior caso. III é incorreta: funcao2 é recursiva (chama a si mesma com subvetor reduzido).
Q26 ENADE 2017 – Ciência da Computação (Bach./Lic.) – Questão 18
Objetiva
O código de Insertion Sort abaixo contém dois erros lógicos (linhas 08 e 10). Qual das alternativas apresenta a correção correta?
01 void insertionSort(int v[], int n) {
02   int i, j, chave;
03   for (i = 1; i < n; i++) {
04     chave = v[i];
05     j = i - 1;
06     /* linha 08 */
07     while (j >= 0 && v[j] < chave) {
08       /* linha 10 */
09       v[j-1] = v[j];
10       j--;
11     }
12     v[j+1] = chave;
13   }
14 }
  • A Linha 07: v[j] > chave; linha 09 permanece v[j-1]=v[j].
  • B Linha 07 permanece; linha 09: v[j+1]=v[j].
  • C Linha 07: v[j] >= chave; linha 09: v[j-1]=v[j].
  • D Linha 07: v[j] > chave; linha 09: v[j+1]=v[j].
  • E Linha 07: v[j] >= chave; linha 09: v[j+1]=v[j].
Gabarito: D — Erro 1: a condição deveria ser v[j] > chave (mover elementos maiores que a chave). Erro 2: o deslocamento correto é v[j+1]=v[j] (copia elemento uma posição à direita), não v[j-1]=v[j].
Q27 ENADE 2021 – Ciência da Computação (Bach.) – Questão 32
Objetiva
Considere a implementação do Quicksort com partição de Lomuto (pivô = último elemento). Analise as afirmativas:
I. No pior caso, a profundidade da recursão é O(n), exigindo O(n) de espaço na pilha de chamadas.
II. O Quicksort é um algoritmo recursivo e estável.
III. A complexidade de tempo médio do Quicksort é O(n log n).
IV. Escolher sempre o primeiro elemento como pivô torna o Quicksort mais eficiente em vetores já ordenados.
  • A I e III.
  • B II e III.
  • C I e IV.
  • D II e IV.
  • E I, II e III.
Gabarito: A — I é correta: pior caso (vetor ordenado com pivô no extremo) gera recursão de profundidade n. II é incorreta: Quicksort é recursivo mas não estável (pode trocar elementos iguais de ordem). III é correta: O(n log n) no caso médio. IV é incorreta: pivô no primeiro elemento é a pior escolha para vetores já ordenados.
Q28 ENADE 2019 – Engenharia de Computação – Questão 25
Objetiva
Considere uma implementação de busca binária em Python com recursão em cauda. Analise as afirmativas sobre possíveis refatorações:
I. Trocar a ordem das linhas 10 e 12 no código não altera o resultado da função.
II. Substituir a chamada recursiva em cauda por um laço while True elimina a recursão em cauda mantendo o resultado.
III. Introduzir variáveis auxiliares remove a recursão em cauda da função.
IV. Reorganizar o código para conter uma única chamada recursiva ao final mantém o resultado para qualquer entrada.
  • A I apenas.
  • B II e III.
  • C II e IV.
  • D I, III e IV.
  • E I, II, III e IV.
Gabarito: C — II é correta: recursão em cauda pode sempre ser substituída por laço iterativo. IV é correta: reagrupar para ter uma única chamada recursiva final é equivalente e mantém resultados. I é incorreta: troca de linhas pode alterar fluxo. III é incorreta: variáveis auxiliares sem estrutura de laço não eliminam a recursão.
Q29 ENADE 2019 – Engenharia de Computação – Questão 9
Objetiva
Qual das implementações Java do MergeSort abaixo está correta?
/* A */ void sort(int[] a,int lo,int hi){ if(hi==lo) return;
         int mid=lo+(hi-lo)/2; sort(a,lo,mid); sort(a,mid+1,hi); merge(a,lo,mid,hi); }
/* B */ void sort(int[] a,int lo,int hi){ if(hi>lo) return;
         int mid=lo+(hi-lo)/2; sort(a,lo,mid); sort(a,mid+1,hi); merge(a,lo,mid,hi); }
/* C */ void sort(int[] a,int lo,int hi){ if(hi<=lo) return;
         int mid=lo+(hi-lo)/2; sort(a,lo,mid); sort(a,mid,hi); merge(a,lo,mid,hi); }
/* D */ void sort(int[] a,int lo,int hi){ if(hi>lo) return;
         int mid=lo+(hi-lo)/2; sort(a,lo,mid); sort(a,mid+1,hi); merge(a,lo,mid,hi); }
/* E */ void sort(int[] a,int lo,int hi){ if(hi<=lo) return;
         int mid=lo+(hi-lo)/2; sort(a,lo,mid); sort(a,mid+1,hi); merge(a,lo,mid,hi); }
  • A Alternativa A.
  • B Alternativa B.
  • C Alternativa C.
  • D Alternativa D.
  • E Alternativa E.
Gabarito: E — Caso base correto: if(hi<=lo) return (subarray de 0 ou 1 elemento). Divisão: sort(a,lo,mid) e sort(a,mid+1,hi) (sem sobreposição). A usa hi==lo (falha para subarray de 1 elemento). B usa hi>lo (nunca retorna cedo). C divide errado: sort(a,lo,mid) e sort(a,mid,hi) sobrepõem mid. D igual a B.
Q30 ENADE 2023 – Engenharia de Computação – Discursiva 2
Discursiva
Uma rede de varejo possui tabela X com N registros e precisa eliminar duplicatas. São propostos dois algoritmos:
Algoritmo A (busca sequencial): para cada registro, verifica todos os anteriores — O(N²).
Algoritmo B (quicksort + varredura): ordena a tabela e remove duplicatas consecutivas em O(N log N).
a) Quantas comparações no máximo realiza o Algoritmo A?
b) Quantas comparações na varredura pós-ordenação do Algoritmo B?
c) Identifique os parâmetros a, b, c, d da chamada recursiva do quicksort: particiona(X, a, b) e particiona(X, c, d).
d) Implemente a função particiona usando trocas.
Gabarito: Discursiva — a) N(N−1)/2 comparações. b) N−1 comparações. c) a=ini, b=x−1; c=x+1, d=fim (x = posição final do pivô). d) Escolhe pivô (ex. último elemento); percorre com dois índices; troca elementos fora de ordem; coloca pivô na posição correta. Padrão INEP disponível na prova oficial.
Q31 ENADE 2005 – Computação (CC e SI) – Questão 13
Objetiva
Analise as afirmativas sobre algoritmos de ordenação:
I. O algoritmo de insertion sort tem complexidade de tempo O(n × log n) no pior caso.
II. Um algoritmo de ordenação é estável se não altera a posição relativa de elementos com chaves iguais.
III. A escolha do pivô influencia a eficiência do algoritmo quicksort.
IV. Os algoritmos bubble sort e insertion sort têm o mesmo número médio de comparações.
  • A I e II.
  • B I e III.
  • C II e IV.
  • D I, III e IV.
  • E II, III e IV.
Gabarito: E — I é incorreta: insertion sort é O(n²) no pior caso. II é correta: estabilidade preserva a ordem relativa de iguais. III é correta: pivô ruim (ex. extremo em vetor ordenado) leva ao pior caso O(n²). IV é correta: ambos têm Θ(n²) comparações em média.
Q32 ENADE 2005 – Computação (CC e SI) – Questão 15
Objetiva
Um algoritmo de ordenação divide o problema de n elementos em duas metades recursivamente e combina as soluções. Sua relação de recorrência é T(n) = 2T(n/2) + Θ(n). Qual é a complexidade de tempo desse algoritmo?
  • A O(n²).
  • B O(n² × log n).
  • C O(2ⁿ).
  • D O(log n × log n).
  • E O(n × log n).
Gabarito: E — Pelo Teorema Mestre, T(n) = 2T(n/2) + Θ(n): a = 2, b = 2, f(n) = Θ(n) = Θ(n^log₂2). Caso 2 do Teorema Mestre: T(n) = Θ(n log n). Este é o MergeSort.
Q33 ENADE 2005 – Computação (CC e EC) – Questão 43
Objetiva
Aplica-se busca binária a vetores ordenados de tamanho 50, 1 000 e 300. Qual é o número máximo de comparações para cada tamanho (usando ⌊log₂n⌋ + 1)?
  • A 5, 100, 30.
  • B 6, 10, 9.
  • C 8, 31, 18.
  • D 10, 100, 30.
  • E 25, 500, 150.
Gabarito: B — n=50: ⌊log₂50⌋+1 = 5+1 = 6. n=1000: ⌊log₂1000⌋+1 = 9+1 = 10. n=300: ⌊log₂300⌋+1 = 8+1 = 9.
Q34 ENADE 2008 – Tecnologia em ADS – Questão 20
Objetiva
Execute o Bubble Sort sobre V = {2, 0, 4, 3, 1}. Analise os rastreamentos abaixo, onde I e J são os índices externo e interno do algoritmo (J percorre comparando pares adjacentes):
I. I=0, J=1: após essa comparação V = {0, 2, 4, 3, 1}.
II. I=1, J=0: após a passagem I=1, V = {0, 2, 3, 1, 4}.
III. I=1, J=2: após essa comparação V = {0, 2, 1, 3, 4}.
  • A I apenas.
  • B I e II.
  • C I e III.
  • D II e III.
  • E I, II e III.
Gabarito: E — I: compara v[0]=2 e v[1]=0; troca → {0,2,4,3,1}. II: passagem I=1 move o segundo maior (4) para penúltimo; resultado {0,2,3,1,4}. III: no contexto da passagem I=1, J=2 compara v[2]=4 e v[3]=3; troca → {0,2,1,3,4}. Todas corretas.
Q35 ENADE 2008 – Tecnologia em ADS – Questão 22
Objetiva
O pseudocódigo da busca binária em V[0..9] está incompleto (linhas 6, 8 e 12 em branco). Qual sequência de instruções completa corretamente o algoritmo?
01 Função BuscaBin(V, n, x)
02   F ← n - 1
03   /* linha 06: inicializa C */
04   enquanto C ≤ F faça
05     M ← /* linha 08 */
06     se V[M] = x então retorna M
07     se V[M] < x então /* linha 12 */
08     senão F ← M - 1
09   retorna -1
  • A Linha 06: C ← 0; Linha 08: (C+F)/2; Linha 12: C ← M+1.
  • B Linha 06: C ← 1; Linha 08: (C+F)/2; Linha 12: C ← M+1.
  • C Linha 06: C ← 0; Linha 08: (C+F)/2; Linha 12: C ← M-1.
  • D Linha 06: C ← 0; Linha 08: (C+F+1)/2; Linha 12: C ← M+1.
  • E Linha 06: C ← 1; Linha 08: (C+F-1)/2; Linha 12: C ← M.
Gabarito: A — C (cursor esquerdo) inicia em 0. O meio é M = (C+F)/2. Quando V[M] < x, o elemento buscado está à direita: C ← M+1. Quando V[M] > x (linha 08), está à esquerda: F ← M-1.
5
Recursão e análise de complexidade
Recursão Notação Big-O Classes P e NP Fibonacci / Hanói
Q36 ENADE 2014 – Ciência da Computação (Bach.) – Questão 12
Objetiva
Analise o custo computacional dos algoritmos a seguir, que calculam P(x) = aₙxⁿ + aₙ₋₁xⁿ⁻¹ + ··· + a₁x + a₀, com coeficientes armazenados em a[0..n] e x dado:
Algoritmo 1 (ingênuo):
soma = a[0]
Repita para i = 1 até n
  Se a[i] ≠ 0.0 então
    potência = x
    Repita para j = 2 até i
      potência = potência * x
    soma = soma + a[i] * potência
  Fim se
Imprima(soma)

Algoritmo 2 (Horner):
soma = a[n]
Repita para i = n-1 até 0 passo -1
  soma = soma * x + a[i]
Imprima(soma)
Avalie as asserções e a relação entre elas:
I. Os algoritmos possuem a mesma complexidade assintótica.
PORQUE
II. Para o melhor caso, ambos os algoritmos possuem complexidade O(n).
  • A As asserções I e II são verdadeiras, e a II é justificativa correta da I.
  • B As asserções I e II são verdadeiras, mas a II não é justificativa correta da I.
  • C A asserção I é verdadeira, e a II é falsa.
  • D A asserção I é falsa, e a II é verdadeira.
  • E As asserções I e II são falsas.
Gabarito: D — I é falsa: Algoritmo 1 é Θ(n²) no pior caso; Algoritmo 2 (Horner) é Θ(n) em qualquer caso. II é verdadeira: no melhor caso do Algoritmo 1, só aₙ ≠ 0, então o laço interno não executa e o custo total é O(n).
Q37 ENADE 2014 – Ciência da Computação (Bach.) – Questão 23
Objetiva
Qual o valor de retorno da função a seguir, caso n = 27?
int recursao (int n) {
    if (n <= 10) {
        return n * 2;
    }
    else {
        return recursao(recursao(n/3));
    }
}
  • A 8
  • B 9
  • C 12
  • D 16
  • E 18
Gabarito: D — Divisão inteira: r(27)=r(r(9))=r(18); r(18)=r(r(6))=r(12); r(12)=r(r(4))=r(8)=16. Logo r(27)=16.
Q38 ENADE 2017 – Ciência da Computação (Bach.) – Questão 25
Objetiva
A sequência de Fibonacci começa em 1, 1 e cada elemento subsequente é a soma dos dois anteriores. A função fib abaixo calcula o n-ésimo elemento:
unsigned int fib (unsigned int n)
{
    if (n < 2)
        return 1;
    return fib(n - 2) + fib (n - 1);
}
Avalie as afirmações:
I. A complexidade de tempo da função fib é exponencial no valor de n.
II. A complexidade de espaço da função fib é exponencial no valor de n.
III. É possível implementar uma versão iterativa de fib com complexidade de tempo linear e de espaço constante.
  • A I, apenas.
  • B II, apenas.
  • C I e III, apenas.
  • D II e III, apenas.
  • E I, II e III.
Gabarito: C — I correta: T(n)=T(n−1)+T(n−2)+Θ(1) → Θ(φⁿ), exponencial. II incorreta: o espaço é a profundidade máxima da pilha, que é n → Θ(n), linear. III correta: versão iterativa guarda apenas dois valores anteriores, tempo Θ(n) e espaço Θ(1).
Q39 ENADE 2017 – Ciência da Computação (Bach.) – Questão 33
Objetiva
Considere a função recursiva F a seguir, que em sua execução chama a função G:
void F(int n) {
    if(n > 0) {
        for(int i = 0; i < n; i++) {
            G(i);
        }
        F(n/2);
    }
}
Avalie as afirmações:
I. A equação de recorrência que define a complexidade de F é a mesma do algoritmo mergesort.
II. O número de chamadas recursivas da função F é Θ(log n).
III. O número de vezes que a função G da linha 4 é chamada é O(n log n).
  • A I, apenas.
  • B II, apenas.
  • C I e III, apenas.
  • D II e III, apenas.
  • E I, II e III.
Gabarito: B — I incorreta: F tem T(n)=T(n/2)+Θ(n) (uma chamada recursiva); o mergesort tem T(n)=2T(n/2)+Θ(n) (duas). II correta: o argumento é dividido por 2 a cada chamada → ⌊log₂n⌋+1 chamadas = Θ(log n). III incorreta pelo gabarito: G é chamada n+n/2+n/4+···<2n vezes, ou seja, Θ(n) — que é também O(n log n), mas a banca considerou a afirmativa imprecisa (usa O em vez de Θ).
Q40 ENADE 2014 – Ciência da Computação (Bach.) – Questão 28
Objetiva
Um cientista afirma ter encontrado uma redução polinomial de um problema NP-Completo para um problema pertencente à classe P. Avalie as asserções e a relação entre elas:
I. A descoberta do cientista implica P = NP.
PORQUE
II. A descoberta do cientista implica na existência de algoritmos polinomiais para todos os problemas NP-Completos.
  • A As asserções I e II são verdadeiras, e a II é justificativa correta da I.
  • B As asserções I e II são verdadeiras, mas a II não é justificativa correta da I.
  • C A asserção I é verdadeira, e a II é falsa.
  • D A asserção I é falsa, e a II é verdadeira.
  • E As asserções I e II são falsas.
Gabarito: A — Se um NP-completo X se reduz a Y∈P, então X∈P. Como todo problema de NP se reduz a X (definição de NP-completude), todo NP passa a ter algoritmo polinomial (II). Daí NP⊆P e, como P⊆NP, temos P=NP (I). A II é exatamente o argumento que sustenta a I.
Q41 ENADE 2019 – Engenharia de Computação – Discursiva 4
Discursiva
Na matemática, um produtório é definido como ∏ᵢ₌ₘⁿ xᵢ = xₘ × xₘ₊₁ × ··· × xₙ₋₁ × xₙ. Com base nessa equação, e considerando que xᵢ = i + 1/i (com i > 0), faça o que se pede:
a) Escreva uma função iterativa, em linguagem C, que receba os parâmetros de limite inferior m e superior n, calcule e retorne o resultado do produtório. (5,0 pontos)
b) Escreva uma função recursiva, em linguagem C, que receba os parâmetros de limite inferior m e superior n, calcule e retorne o resultado do produtório. (5,0 pontos)
Gabarito: Discursiva — Padrão INEP: a) iterativa: float r=1.0; for(i=m;i<=n;i++) r*=i+1.0/i; return r; (usar 1.0/i para evitar divisão inteira). b) recursiva: caso base if(m==n) return n+1.0/n;, passo return (m+1.0/m)*produtorio(m+1,n); O ponto crítico é usar divisão em ponto flutuante (1.0/i), pois 1/i é sempre 0 para i>1 em C.
Q42 ENADE 2023 – Engenharia de Computação – Questão 14
Objetiva
O código a seguir define duas funções em linguagem funcional (Haskell) que manipulam listas de inteiros:
enade :: [Int] -> [Int]
enade [] = []
enade (cabeca:cauda) = auxiliar cabeca (enade cauda)
auxiliar :: Int -> [Int] -> [Int]
auxiliar x [] = [x]
auxiliar x (cabeca:cauda)
  | (x `mod` 2 == 0) = x:cabeca:cauda
  | otherwise = cabeca:auxiliar x cauda
Considerando o código apresentado, se a função enade for executada com a lista [1, 2, 3, 4, 5, 6, 7, 8], o resultado será
  • A [].
  • B [2, 4, 6, 8].
  • C [1, 2, 3, 4, 5, 6, 7, 8].
  • D [2, 4, 6, 8, 1, 3, 5, 7].
  • E [2, 4, 6, 8, 7, 5, 3, 1].
Gabarito: E — enade processa de trás para frente (resolve a cauda antes de chamar auxiliar com a cabeça). auxiliar x l: se x é par, coloca no início; se ímpar, coloca no final. Rastreando de [8] até [1..8]: pares acumulam no início em ordem crescente, ímpares no final em ordem inversa → [2,4,6,8,7,5,3,1].
Q43 ENADE 2023 – Engenharia de Computação – Questão 18
Objetiva
Vetores de tamanho dinâmico são muito utilizados para armazenar listas e tabelas hash. Uma técnica para implementá-los dobra o tamanho do vetor quando o número de itens ultrapassa o tamanho atual. Essa operação requer alocar memória para o dobro do tamanho e copiar todos os elementos para o novo vetor. Considere uma lista linear implementada com um vetor dinâmico, com vetor de tamanho inicial para comportar apenas 1 item e todos os itens com o mesmo tamanho.
Considerando uma sequência de n inserções no final dessa lista, o tempo médio por inserção e o tempo total gasto para executar todas as n operações são, respectivamente, da ordem de
  • A Θ(log n) e Θ(n log n).
  • B Θ(1) e Θ(n).
  • C Θ(1) e Θ(n²).
  • D Θ(n) e Θ(n²).
  • E Θ(√n) e Θ(n^(3/2)).
Gabarito: B — Análise amortizada: as cópias ocorrem quando o vetor passa de 1→2, 2→4, 4→8, …, copiando 1+2+4+···+2^⌊log₂n⌋ < 2n elementos no total. Somando as n escritas, o custo total é menor que 3n, isto é, Θ(n), e o custo médio (amortizado) por inserção é Θ(1).
Q44 ENADE 2005 – Computação (Sistemas de Informação) – Questão 21
Objetiva
No modo recursivo de representação, a descrição de um conceito faz referência ao próprio conceito. Julgue os itens abaixo, com relação à recursividade como paradigma de programação:
I. São elementos fundamentais de uma definição recursiva: o caso-base (base da recursão) e a reaplicação da definição.
II. O uso da recursão não é possível em linguagens com estruturas para orientação a objetos.
III. As linguagens de programação funcionais têm, na recursão, seu principal elemento de repetição.
IV. No que diz respeito ao poder computacional, as estruturas iterativas e recursivas são equivalentes.
V. Estruturas iterativas e recursivas não podem ser misturadas em um mesmo programa.
Estão certos apenas os itens
  • A I e IV.
  • B II e III.
  • C I, III e IV.
  • D I, III e V.
  • E II, IV e V.
Gabarito: C — I correta: toda definição recursiva precisa de caso-base e passo recursivo. II incorreta: Java, C++, Python permitem recursão normalmente. III correta: linguagens funcionais puras (Haskell, Lisp) não têm laços; repetem por recursão. IV correta: todo algoritmo iterativo pode ser escrito recursivamente e vice-versa. V incorreta: é comum misturar as duas (ex.: laço dentro de função recursiva).
Q45 ENADE 2005 – Computação (CC e EC) – Questão 51
Objetiva
No famoso jogo da Torre de Hanói, é dada uma torre com discos de raios diferentes, empilhados por tamanho decrescente em um dos três pinos dados. O objetivo do jogo é transportar toda a torre para um dos outros pinos, de acordo com as regras: apenas um disco pode ser deslocado por vez, e em todo instante todos os discos precisam estar em um dos três pinos; além disso, em nenhum momento um disco pode ser colocado sobre um disco de raio menor que o dele; é claro que o terceiro pino pode ser usado como local temporário para os discos.
Imaginando que se tenha uma situação em que a torre inicial tenha um conjunto de 5 discos, qual o número mínimo de movimentações de discos que deverão ser realizadas para se atingir o objetivo do jogo?
  • A 25
  • B 28
  • C 31
  • D 34
  • E 38
Gabarito: C — T(n) = 2T(n−1)+1, com T(1)=1, cuja solução é T(n) = 2ⁿ−1. Para n=5: 2⁵−1 = 31 movimentos.
Q46 ENADE 2005 – Computação (CC e EC) – Questão 54
Objetiva
Considere que, durante a análise de um problema de programação, tenha sido obtida a seguinte fórmula recursiva que descreve a solução para o problema:
C(i,j) = 0, se i=0 ou j=0; 1+C(i−1,j−1) se 0<i≤M, 0<j≤N e i=j; max{C(i,j−1), C(i−1,j)} se 0<i≤M, 0<j≤N e i≠j
Qual a complexidade da solução encontrada?
  • A O(n × log n)
  • B O(n²)
  • C O(n² × log n)
  • D O(2ⁿ)
  • E O(n³)
Gabarito: B — A fórmula é a recorrência da subsequência comum mais longa (LCS). Resolvida por programação dinâmica, preenche-se uma tabela de (M+1)×(N+1) posições, cada uma em tempo constante: Θ(M·N), ou seja, O(n²) quando as duas sequências têm tamanho n.
Q47 ENADE 2005 – Computação (Ciência da Computação) – Questão 65
Objetiva
A análise de complexidade provê critérios para a classificação de problemas com base na computabilidade de suas soluções. Nesse contexto, julgue os itens a seguir:
I. É possível demonstrar que P ⊆ NP e NP ⊆ P.
II. É possível demonstrar que se P ≠ NP, então P ∩ NP-Completo = ∅.
III. Se um problema Q é NP-difícil e Q ∈ NP, então Q é NP-completo.
IV. O problema da satisfatibilidade de uma fórmula booleana F foi provado ser NP-difícil e NP-Completo.
V. Encontrar o caminho mais curto entre dois vértices dados em um grafo de N vértices e M arestas não é um problema da classe P.
Estão certos apenas os itens
  • A I, III e IV.
  • B II, III e IV.
  • C III, IV e V.
  • D I, II, III e IV.
  • E II, III, IV e V.
Gabarito: B — I incorreta: P ⊆ NP é demonstrável, mas NP ⊆ P é justamente o problema em aberto P × NP. II correta: se P≠NP, nenhum NP-completo está em P. III correta: é a definição de NP-completo (NP-difícil e pertencente a NP). IV correta: é o Teorema de Cook-Levin (1971). V incorreta: caminho mínimo é resolvido em tempo polinomial (Dijkstra, Bellman-Ford), portanto está em P.
Q48 ENADE 2008 – Computação (CC, EC e SI) – Questão 18
Objetiva
Os números de Fibonacci constituem uma sequência na qual os dois primeiros elementos são 0 e 1 e os demais, a soma dos dois elementos imediatamente anteriores: fib(0)=0, fib(1)=1, fib(n)=fib(n−1)+fib(n−2) se n>1. A implementação abaixo em linguagem funcional não reutiliza resultados previamente computados:
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
Considerando o programa acima, quantas chamadas são feitas à função fib para computar fib 5?
  • A 11
  • B 12
  • C 15
  • D 24
  • E 25
Gabarito: C — Seja c(n) o número de chamadas para calcular fib n (contando a própria): c(0)=c(1)=1 e c(n)=1+c(n−1)+c(n−2). Então c(2)=3, c(3)=5, c(4)=9 e c(5)=1+9+5=15. Em geral, c(n)=2·fib(n+1)−1.
Q49 ENADE 2008 – Tecnologia em Análise e Desenvolvimento de Sistemas – Questão 27
Objetiva
Os termos da sequência de Fibonacci são definidos por Fibonacci(0)=0, Fibonacci(1)=1, Fibonacci(n)=Fibonacci(n−1)+Fibonacci(n−2). Uma solução recursiva para o cálculo do i-ésimo termo é dada pela função a seguir:
funcao fibonacci(inteiro longo n)
   se((n=0) OU (n=1)) entao
       retorne n
   senao
       retorne fibonacci(n-1) + fibonacci(n-2)
   fim se
fim
Acerca da execução recursiva dessa função, assinale a opção incorreta.
  • A À medida que o valor de n cresce, há um aumento no número de chamadas recursivas.
  • B Na linha 4, a ordem de execução é calcular o valor para fibonacci(n-1) e somente depois calcular o valor para fibonacci(n-2).
  • C O método recursivo é o mais eficiente para o cálculo do i-ésimo termo da sequência de Fibonacci, pois realiza duas chamadas por passo da recursão, cada uma mais simples do que a chamada original.
  • D As condições de parada da recursão são: o valor de n é 0 ou o valor de n é 1.
  • E O uso da recursão para o problema da série de Fibonacci não é indicado, pois ele gera rapidamente uma explosão de chamadas do método.
Gabarito: C — A alternativa C é a incorreta: a versão recursiva é a menos eficiente, justamente porque as duas chamadas recalculam os mesmos valores repetidas vezes, levando a tempo exponencial Θ(φⁿ). Uma versão iterativa (ou com memorização) é O(n). As demais afirmativas são verdadeiras.
Q50 ENADE 2011 – Computação (todas as áreas) – Discursiva 3
Discursiva
Os números de Fibonacci correspondem a uma sequência infinita na qual os dois primeiros termos são 0 e 1. Cada termo da sequência, à exceção dos dois primeiros, é igual à soma dos dois anteriores, conforme a relação de recorrência: fₙ = fₙ₋₁ + fₙ₋₂
Desenvolva dois algoritmos, um iterativo e outro recursivo, que, dado um número natural n > 0, retorna o n-ésimo termo da sequência de Fibonacci. Apresente as vantagens e desvantagens de cada algoritmo. (valor: 10,0 pontos)
Gabarito: Discursiva — Padrão INEP: Algoritmo iterativo: mantém dois valores anteriores em variáveis locais, tempo Θ(n), espaço Θ(1). Algoritmo recursivo: implementa diretamente a recorrência, mas tempo exponencial Θ(φⁿ) e espaço da pilha O(n). Vantagem do recursivo: clareza/correspondência direta com a definição. Vantagem do iterativo: eficiência em tempo e espaço. Observação: o padrão considera o 1º termo como 0 (fibonacci(1)=0, fibonacci(2)=1).
Q51 ENADE 2011 – Ciência da Computação – Questão 36
Objetiva
O problema P versus NP é um problema ainda não resolvido e um dos mais estudados em Computação. A classe P contém os problemas cujas soluções podem ser eficientemente obtidas (algoritmos de pior caso polinomial). A classe NP contém os problemas para os quais uma solução pode ser eficientemente verificada. Um problema é NP-completo se pertence à NP e todo problema em NP pode ser eficientemente transformado nesse problema.
Considerando as noções de complexidade computacional apresentadas acima, analise as afirmações:
I. Existem problemas na classe P que não estão na classe NP.
II. Se o problema A pode ser eficientemente transformado no problema B e B está na classe P, então A está na classe P.
III. Se P = NP, então um problema NP-completo pode ser solucionado eficientemente.
IV. Se P é diferente de NP, então existem problemas na classe P que são NP-completos.
É correto apenas o que se afirma em
  • A I.
  • B IV.
  • C I e III.
  • D II e III.
  • E II e IV.
Gabarito: D — I incorreta: P ⊆ NP (toda solução polinomial também é verificável em tempo polinomial). II correta: para resolver A, transforma-se a entrada em instância de B (tempo polinomial) e resolve-se B (tempo polinomial); a composição continua polinomial. III correta: se P=NP, todo problema de NP, inclusive os NP-completos, está em P. IV incorreta: é o contrário — se P≠NP, nenhum problema NP-completo está em P.
6
Grafos
Dijkstra Kruskal DFS / BFS Coloração / A*
Q52 ENADE 2017 – Ciência da Computação (Bach.) – Discursiva 5
Discursiva
A busca primeiro em profundidade (DFS) é um algoritmo de exploração sistemática em grafos, em que as arestas são exploradas a partir do vértice v mais recentemente descoberto que ainda tem arestas inexploradas saindo dele. Quando todas as arestas de v são exploradas, a busca regressa para explorar as arestas que deixam o vértice a partir do qual v foi descoberto. O processo continua até que todos os vértices acessíveis a partir do vértice inicial sejam explorados.
Considere o grafo dirigido com vértices {p, q, r, s, t, u, w, x, y, z} e arestas dirigidas (q→s, q→t, q→w, s→p, p→w, w→s, t→x, t→y, x→z, z→x, y→q, r→u, r→y, u→y).
a) Mostre a sequência de vértices descobertos durante a execução de uma busca em profundidade com controle de estados repetidos, utilizando o vértice r como inicial. No caso de um vértice explorado ter mais de um vértice adjacente, utilize a ordem alfabética crescente como critério para priorizar a exploração. (valor: 7,0 pontos)
b) Faça uma representação da matriz de adjacências desse grafo, podendo os zeros ser omitidos nessa matriz. (valor: 3,0 pontos)
Gabarito: Discursiva — a) Uma das soluções aceitas: r–u–y–q–s–p–w–t–x–z (DFS recursiva, vizinhos em ordem alfabética). b) Matriz de adjacências com 1 nas posições (origem, destino) correspondentes às arestas; aceita-se também a transposta.
Q53 ENADE 2017 – Ciência da Computação (Bach.) – Questão 24
Objetiva
A figura exibe um grafo que representa um mapa rodoviário, com vértices como cidades (i, j, k, w e outros) e arestas como vias com pesos de tempo de deslocamento. Considerando que os tempos de ida e volta são iguais para qualquer via, avalie as afirmações acerca desse grafo:
I. Dado o vértice de origem i, o algoritmo de Dijkstra encontra o menor tempo de deslocamento entre a cidade i e as demais cidades do grafo.
II. Uma árvore geradora de custo mínimo gerada pelo algoritmo de Kruskal contém um caminho de custo mínimo cuja origem é i e cujo destino é k.
III. Se um caminho de custo mínimo entre os vértices i e k contém o vértice w, então o subcaminho de origem w e destino k deve também ser mínimo.
  • A I, apenas.
  • B II, apenas.
  • C I e III, apenas.
  • D II e III, apenas.
  • E I, II e III.
Gabarito: E — I correta: Dijkstra calcula os caminhos mínimos de uma origem para todos os vértices (pesos não negativos). II correta (para este grafo): o caminho de i a k na árvore de Kruskal custa 7, que coincide com o mínimo. III correta: subestrutura ótima — se o subcaminho w→k não fosse mínimo, bastaria substituí-lo por um mais curto para obter um caminho i→k mais barato, contradizendo a hipótese.
Q54 ENADE 2017 – Sistemas de Informação – Questão 19
Objetiva
A teoria dos grafos estuda as relações entre elementos em um determinado conjunto. Um grafo G(V,E) é determinado por um conjunto não vazio de vértices (V) e um subconjunto de pares de vértices não ordenados, chamados arestas (E). A figura seguinte representa a possibilidade de voos de uma companhia aérea tal que V = {Porto Alegre, Curitiba, São Paulo, Rio de Janeiro e Brasília} e E = {{Curitiba, São Paulo}, {São Paulo, Rio de Janeiro}, {Porto Alegre, Rio de Janeiro}, {São Paulo, Brasília}}. Avalie as afirmações:
I. São Paulo é adjacente a Porto Alegre.
II. Porto Alegre possui valência igual a 2.
III. Rio de Janeiro é incidente em São Paulo e Porto Alegre.
IV. Curitiba possui comprimento igual a 2.
  • A I e II.
  • B II e III.
  • C III e IV.
  • D I, II e IV.
  • E I, III e IV.
Gabarito: B — I incorreta: não existe a aresta {São Paulo, Porto Alegre}. II correta: Porto Alegre tem grau (valência) 2 (Curitiba e Rio de Janeiro). III correta (no sentido usado pela banca): as arestas {São Paulo, Rio} e {Porto Alegre, Rio} incidem em Rio de Janeiro, que assim se liga a São Paulo e a Porto Alegre. IV incorreta: "comprimento" é propriedade de caminhos, não de vértices; para vértices fala-se em grau.
Q55 ENADE 2021 – Ciência da Computação (Bach.) – Questão 34
Objetiva
O algoritmo de Dijkstra para o problema do caminho mínimo em dígrafos com pesos utiliza uma fila de prioridades de vértices, na qual as prioridades são uma estimativa do custo final. A cada iteração, um vértice é retirado da fila e os arcos que começam nesse vértice são analisados. Considere o grafo a seguir com arcos: D→A(5), D→B(9), D→E(5), D→F(1), A→B(2), B→C(8), E→B(1), E→C(5), F→E(3), F→G(1), G→E(1). Deseja-se conhecer o custo de um caminho mínimo para cada vértice a partir do vértice D. Considere que −1 representa custo "infinito". Assinale a alternativa que representa a estimativa de custo após duas iterações do algoritmo.
  • A A: 5 B: 6 C: 10 D: 0 E: 4 F: 1 G: −1
  • B A: 5 B: 9 C: −1 D: 0 E: 5 F: 1 G: −1
  • C A: 5 B: 9 C: −1 D: 0 E: 4 F: 1 G: 2
  • D A: 5 B: 7 C: 8 D: 0 E: 4 F: 1 G: 2
  • E A: 5 B: 6 C: 8 D: 0 E: 3 F: 1 G: 2
Gabarito: C — Iteração 1: retira D (custo 0), relaxa seus arcos: A=5, B=9, E=5, F=1; C e G continuam −1. Iteração 2: retira o menor da fila, F (custo 1): E=min(5,1+3)=4; G=1+1=2. Estimativas: A 5, B 9, C −1, D 0, E 4, F 1, G 2.
Q56 ENADE 2014 – Ciência da Computação (Bach.) – Questão 30
Objetiva
Uma fazenda possui um único poço artesiano que deve abastecer n bebedouros para o gado. Deseja-se determinar um projeto de ligação entre esses n+1 pontos através de encanamentos com a menor extensão total. Um algoritmo proposto para a solução do problema executa os seguintes passos: (1) Crie n+1 conjuntos unitários, cada um contendo um dos pontos; (2) Crie um conjunto D contendo um registro para cada combinação possível de dois pontos distintos a serem ligados (campos cᵢ, cⱼ e d); (3) Enquanto D não estiver vazio faça: 3.1. Remova o registro de D com o menor valor de distância d; 3.2. Se os valores de cᵢ e cⱼ do registro removido pertencerem a conjuntos distintos de C, então: 3.2.1. Substitua estes dois conjuntos pela união entre eles; 3.2.2. Guarde o registro removido em um conjunto-solução.
Com base na descrição do problema e do algoritmo proposto, conclui-se que
  • A o problema exemplifica a obtenção de uma árvore geradora mínima, portanto está no conjunto P.
  • B o algoritmo é uma heurística para o Problema do Caixeiro Viajante, logo apresenta complexidade polinomial.
  • C o problema descrito é de otimização, logo pertence ao conjunto NP-difícil, mas não ao conjunto NP-completo.
  • D uma alternativa para a solução do problema é usar o algoritmo de Dijkstra para obtenção do caminho mínimo entre dois pontos.
  • E o passo de maior custo do algoritmo é a criação do conjunto D com as combinações de pontos, apresentando complexidade computacional O(n!).
Gabarito: A — O algoritmo descrito é o de Kruskal (ordena arestas por peso, aceita as que unem componentes distintos via union-find). Ligar todos os pontos com extensão mínima é o problema da árvore geradora mínima, resolvido em tempo polinomial O(m log m), logo está em P. B: não é heurística para o caixeiro viajante. C: ser de otimização não torna um problema NP-difícil. D: Dijkstra resolve caminho mínimo, não árvore geradora. E: criar D custa O(n²), não O(n!).
Q57 ENADE 2014 – Ciência da Computação (Bach.) – Questão 22
Objetiva
Considere o processo de fabricação de um produto siderúrgico que necessita passar por n tratamentos térmicos e químicos para ficar pronto. Cada uma das n etapas de tratamento é realizada uma única vez na mesma caldeira. Além do custo próprio de cada etapa do tratamento, existe o custo de se passar de uma etapa para outra (dependendo da sequência escolhida, pode ser necessário alterar a temperatura da caldeira e limpá-la para evitar a reação entre os produtos químicos utilizados). Assuma que o processo de fabricação inicia e termina com a caldeira limpa. Deseja-se projetar um algoritmo para indicar a sequência de tratamentos que possibilite fabricar o produto com o menor custo total. Nessa situação, conclui-se que
  • A a solução do problema é obtida em tempo de ordem O(n log n), utilizando-se um algoritmo ótimo de ordenação.
  • B uma heurística para a solução do problema de coloração de grafos solucionará o problema em tempo polinomial.
  • C o problema se reduz a encontrar a árvore geradora mínima para o conjunto de etapas do processo, requerendo tempo de ordem polinomial para ser solucionado.
  • D a utilização do algoritmo de Dijkstra para se determinar o caminho de custo mínimo entre o estado inicial e o final soluciona o problema em tempo polinomial.
  • E qualquer algoritmo conhecido para a solução do problema descrito possui ordem de complexidade de tempo não-polinomial, uma vez que o problema do caixeiro viajante se reduz a ele.
Gabarito: E — Modelando cada etapa como vértice e o custo de transição como peso da aresta, deseja-se uma ordem que passe por todas as etapas exatamente uma vez, começando e terminando no estado "limpo", com custo mínimo: é um ciclo hamiltoniano de custo mínimo, ou seja, o Problema do Caixeiro Viajante (PCV), que é NP-difícil. A: ordenar não captura os custos dependentes do par. B: coloração é outro problema. C: árvore geradora mínima não impõe sequência única passando por todos os vértices. D: Dijkstra encontra caminho mínimo, mas não obriga a visitar todas as etapas.
Q58 ENADE 2019 – Engenharia de Computação – Questão 11
Objetiva
O gestor de um hotel precisa satisfazer a demanda de vários grupos de eventos pelo uso exclusivo de auditórios por uma semana utilizando o menor número possível de auditórios. A tabela apresenta os conflitos de demandas dos grupos de eventos para todos os dias na semana, em que o valor 1 em uma célula indica que um determinado grupo precisará usar um auditório no mesmo horário que outro grupo e o valor 0 indica que não há conflito entre os dois grupos:
G1–G2: 1, G1–G3: 1, G1–G4: 1, G1–G5: 1, G2–G3: 1, G2–G4: 1, G2–G5: 0, G3–G4: 0, G3–G5: 1, G4–G5: 0.
Nessa situação, o número mínimo de auditórios que satisfaz todas as demandas é de
  • A um.
  • B dois.
  • C três.
  • D quatro.
  • E cinco.
Gabarito: C — Modela-se como coloração de grafos: cada grupo é um vértice, cada conflito (1) é uma aresta, e cada cor é um auditório. O mínimo de auditórios é o número cromático χ(G). Limite inferior: G1, G2 e G3 são mutuamente conflitantes (triângulo), logo χ(G) ≥ 3. Coloração com 3 cores: G1→auditório 1; G2 e G5→auditório 2 (não conflitam entre si); G3 e G4→auditório 3 (não conflitam entre si). Portanto, χ(G) = 3.
Q59 ENADE 2019 – Engenharia de Computação – Questão 24
Objetiva
Protocolos de roteamento de estado de enlace utilizam difusão por spanning tree para evitar a transmissão de pacotes redundantes na rede. Uma spanning tree de um grafo G=(N,E) é um grafo G'=(N,E') tal que E' é um subconjunto de E, G' é conexo, não possui ciclos e contém todos os nós originais em G. Se cada enlace tiver um custo associado e o custo de uma árvore for a soma dos custos dos enlaces, então uma árvore cujo custo seja o mínimo entre todas as spanning trees do grafo é denominada uma spanning tree mínima.
Considere uma rede composta por 6 roteadores (A, B, C, D, E e F) com os seguintes custos de enlace: A–B: 2, A–C: 2, B–C: 2, B–D: 3, C–D: 3, C–E: 1, C–F: 1, D–F: 2, E–F: 1.
Neste cenário, o custo da spanning tree mínima correspondente é, exatamente:
  • A 5.
  • B 7.
  • C 8.
  • D 9.
  • E 11.
Gabarito: C — Aplicando Kruskal (arestas em ordem crescente de custo, descartando as que fecham ciclo): C–E(1) aceita; C–F(1) aceita; E–F(1) descartada (ciclo C–E–F); A–B(2) aceita; A–C(2) aceita (une {A,B} a {C,E,F}); B–C(2) descartada (ciclo); D–F(2) aceita (D entra; 5 arestas para 6 nós: fim). Custo: 1+1+2+2+2 = 8.
Q60 ENADE 2023 – Engenharia de Computação – Questão 32
Objetiva
Suponha que uma empresa de transportes deseje calcular uma rota de Manaus para São Paulo utilizando a estratégia da busca gulosa, técnica de busca local que seleciona a melhor alternativa disponível a cada passo. Observe um grafo de conexão de cidades até o destino final e o quadro com estimativas de distância de São Paulo até as demais cidades do grafo: Manaus=2693km, Porto Velho=2464km, Macapá=2665km, Belém=2463km, Palmas=1489km, Cuiabá=1326km, Goiânia=809km, São Paulo=0km. Com base nessas informações, a solução encontrada a partir da utilização do algoritmo será
  • A Manaus → Macapá → São Paulo
  • B Manaus → Porto Velho → Cuiabá → Goiânia → São Paulo
  • C Manaus → Porto Velho → Palmas → Goiânia → São Paulo
  • D Manaus → Macapá → Belém → Palmas → Goiânia → São Paulo
  • E Manaus → Macapá → Belém → Palmas → Porto Velho → Cuiabá → Goiânia → São Paulo
Gabarito: B — A busca gulosa (greedy best-first) escolhe, a cada passo, o vizinho com a menor estimativa h(n) até o destino: Manaus→Porto Velho(2464 < 2665 de Macapá); Porto Velho→Cuiabá(1326 < 1489 de Palmas); Cuiabá→Goiânia(809); Goiânia→São Paulo(0). A estratégia gulosa olha apenas h(n), sem somar o custo já percorrido g(n), por isso não garante a rota ótima.
Q61 ENADE 2005 – Computação (CC e EC) – Questão 44
Objetiva
Deseja-se supervisionar as redes de comunicação de dados de um conjunto de empresas. Cada empresa tem a sua própria rede, que é independente das redes das outras empresas e é constituída de ramos de fibra óptica. Cada ramo conecta duas filiais distintas (ponto-a-ponto) da empresa. Há, no máximo, um ramo de fibra interligando diretamente um mesmo par de filiais. A tabela abaixo apresenta algumas informações acerca das redes dessas empresas: E1(9 filiais, 18 ramos), E2(10 filiais, 45 ramos), E3(14 filiais, 13 ramos), E4(8 filiais, 24 ramos). Com relação à situação apresentada, é correto deduzir que:
I. no caso da empresa E1, a falha de um ramo de rede certamente fará que, ao menos, uma filial não possa mais comunicar-se diretamente com todas as outras filiais da empresa.
II. na rede da empresa E2, a introdução de um novo ramo de rede certamente violará a informação de que há somente um par de fibras entre duas filiais.
III. no caso da empresa E3, a falha de um único ramo de rede certamente fará que, ao menos, uma filial não possa mais comunicar-se, direta ou indiretamente, com todas as outras filiais da empresa.
IV. na rede da empresa E4, todas as filiais da empresa comunicam-se entre si diretamente.
  • A I e II.
  • B I e IV.
  • C II e III.
  • D II e IV.
  • E III e IV.
Gabarito: C — I incorreta: com 9 vértices e 18 arestas a rede não é completa (C(9,2)=36), então há filiais que não se comunicam diretamente; a falha de um ramo não é o que "faz isso". II correta: C(10,2)=45, ou seja, E2 já é o grafo completo K₁₀; qualquer novo ramo duplicaria uma ligação existente. III correta: um grafo conexo com n vértices e n−1 arestas (14 e 13) é uma árvore; remover qualquer aresta o desconecta. IV incorreta: para todas as filiais se ligarem diretamente seriam necessários C(8,2)=28 ramos; há apenas 24.
Q62 ENADE 2005 – Computação (CC e EC) – Questão 48
Objetiva
Considere o diagrama de Hasse apresentado abaixo, com os vértices Adriano (topo), Ronaldo (segundo nível), Emerson e José Roberto (terceiro nível, ambos ligados a Ronaldo), e Marcos (base, ligado a Emerson e José Roberto). Assinale a opção que apresenta uma lista ordenada, da esquerda para a direita, que preserva a ordem do diagrama.
  • A Marcos, José Roberto, Emerson, Ronaldo, Adriano
  • B Emerson, Marcos, Ronaldo, Adriano, José Roberto
  • C Adriano, Ronaldo, José Roberto, Marcos, Emerson
  • D Ronaldo, Marcos, Emerson, Adriano, José Roberto
  • E Marcos, Adriano, Emerson, José Roberto, Ronaldo
Gabarito: A — O diagrama de Hasse define uma ordem parcial: Marcos < Emerson, Marcos < José Roberto, Emerson < Ronaldo, José Roberto < Ronaldo, Ronaldo < Adriano. Uma lista que "preserva a ordem" é uma ordenação topológica desse grafo: cada elemento aparece depois de todos os que estão abaixo dele. Marcos vem primeiro, depois Emerson e José Roberto (em qualquer ordem entre si), depois Ronaldo e por fim Adriano. Só a alternativa A respeita isso.
Q63 ENADE 2005 – Computação (Ciência da Computação) – Questão 58
Objetiva
Num grafo de rotas entre as cidades A e M, cada nó representa uma cidade e cada ramo uma rodovia com peso = distância em km. Os valores h (distância em linha reta de cada cidade até M) são fornecidos em uma tabela: A=44,72 B=20,00 C=33,54 D=25,00 E=30,67 F=22,36 G=14,14 H=10,00 I=11,18 J=5,00 K=40,00 L=20,00. Julgue os itens relativos a algoritmos de busca:
I. Utilizando-se o algoritmo A*, a rota entre A e M encontrada no problema acima é ACDFLM e o custo do caminho é 56,18.
II. Utilizando-se a busca gulosa, a rota encontrada no problema acima é ACDFLM.
III. Para utilizar algoritmos de busca heurística, deve-se definir uma heurística que superestime o custo da solução.
IV. O A* é um algoritmo ótimo e completo quando heurísticas admissíveis são utilizadas.
V. No simulated annealing, é possível haver movimentos para um estado com avaliação pior do que a do estado corrente, dependendo da temperatura do processo e da probabilidade de escolha.
  • A I, II e III.
  • B I, IV e V.
  • C I, III e V.
  • D II, III, e IV.
  • E II, IV e V.
Gabarito: B — I correta: A* expande o nó de menor f=g+h; o caminho A→C→D→F→L→M tem custo 11,18+10+5+10+20=56,18. II incorreta: a busca gulosa usa só h; de A escolhe B(h=20,00, menor que C e K), leva à rota ABHGIJM — não ACDFLM. III incorreta: para A* ser ótimo a heurística deve ser admissível, isto é, nunca superestimar o custo real. IV correta: com heurística admissível (e grafo finito com custos positivos), A* é completo e ótimo. V correta: o simulated annealing aceita movimentos piores com probabilidade e^(−Δ/T), que diminui conforme a temperatura cai.
Q64 ENADE 2008 – Ciência da Computação – Questão 31
Objetiva
Julgue os itens a seguir, relativos a métodos de busca com informação (busca heurística) e sem informação (busca cega), aplicados a problemas em que todas as ações têm o mesmo custo, o grafo de busca tem fator de ramificação finito e as ações não retornam a estados já visitados:
I. A primeira solução encontrada pela estratégia de busca em largura é a solução ótima.
II. A primeira solução encontrada pela estratégia de busca em profundidade é a solução ótima.
III. As estratégias de busca com informação usam funções heurísticas que, quando bem definidas, permitem melhorar a eficiência da busca.
IV. A estratégia de busca gulosa é eficiente porque expande apenas os nós que estão no caminho da solução.
  • A I e II.
  • B I e III.
  • C I e IV.
  • D II e IV.
  • E III e IV.
Gabarito: B — I correta: com custos iguais, a busca em largura encontra primeiro a solução com menos ações, que é a de menor custo. II incorreta: a busca em profundidade pode achar primeiro uma solução muito longa. III correta: heurísticas bem definidas guiam a busca e reduzem o número de nós expandidos. IV incorreta: a gulosa pode expandir nós fora do caminho da solução (e pode nem achar a ótima), como na Questão 63.
Q65 ENADE 2008 – Engenharia de Computação – Questão 51
Objetiva
Considere um jogo do tipo 8-puzzle, cujo objetivo é conduzir o tabuleiro esquematizado na figura abaixo para o seguinte estado final: [1 2 3 / 8 _ 4 / 7 6 5]. Em determinado instante do jogo, tem-se o estado E0: [3 4 6 / 5 8 _ / 2 1 7]. Os próximos estados possíveis são E1 (espaço move para cima), E2 (espaço move para esquerda) e E3 (espaço move para direita). Considere uma função heurística h embasada na soma das distâncias de Manhattan das peças em relação ao estado final desejado. Utilizando-se um algoritmo de busca gulosa pela melhor escolha que utiliza a função h, o próximo estado no desenvolvimento do jogo a partir do estado E0 tem de ser E3, porque dos três estados E1, E2 e E3 possíveis, o estado com menor soma das distâncias entre a posição atual das peças e a posição final é o estado E3. Assinale a opção correta a respeito dessas asserções.
  • A As duas asserções são proposições verdadeiras, e a segunda é uma justificativa correta da primeira.
  • B As duas asserções são proposições verdadeiras, e a segunda não é uma justificativa correta da primeira.
  • C A primeira asserção é uma proposição verdadeira, e a segunda é uma proposição falsa.
  • D A primeira asserção é uma proposição falsa, e a segunda é uma proposição verdadeira.
  • E As duas asserções são proposições falsas.
Gabarito: A — h é a soma das distâncias de Manhattan. Calculando: h(E0)=19, h(E1)=20, h(E2)=20, h(E3)=18. A busca gulosa escolhe o sucessor de menor h, que é E3 (h=18). As duas asserções são verdadeiras, e a segunda justifica a primeira.
Q66 ENADE 2011 – Computação (todas as áreas) – Questão 20
Objetiva
Considere que G é um grafo qualquer e que V e E são os conjuntos de vértices e de arestas de G, respectivamente. Considere também que grau(v) é o grau de um vértice v pertencente ao conjunto V. Nesse contexto, analise as seguintes asserções:
Em G, a quantidade de vértices com grau ímpar é ímpar.
PORQUE
Para G, vale a identidade dada pela expressão ∑ᵥ∈V grau(v) = 2|E|.
  • A As duas asserções são proposições verdadeiras, e a segunda é uma justificativa correta da primeira.
  • B As duas asserções são proposições verdadeiras, mas a segunda não é uma justificativa correta da primeira.
  • C A primeira asserção é uma proposição verdadeira, e a segunda, uma proposição falsa.
  • D A primeira asserção é uma proposição falsa, e a segunda, uma proposição verdadeira.
  • E Tanto a primeira quanto a segunda asserções são proposições falsas.
Gabarito: D — A segunda asserção é o Lema do Aperto de Mãos: cada aresta contribui com 2 para a soma dos graus. Como essa soma é par, a soma dos graus ímpares também tem de ser par, o que só é possível se a quantidade de vértices de grau ímpar for par — a primeira asserção é falsa (o lema prova exatamente o contrário dela).
Q67 ENADE 2011 – Ciência da Computação – Questão 40
Objetiva
Considere que a figura abaixo corresponde ao cenário de um jogo de computador. Esse cenário é dividido em 24 quadrados e a movimentação de um personagem entre cada quadrado tem custo 1, sendo permitida apenas na horizontal ou na vertical. Os quadrados marcados em preto correspondem a regiões para as quais os personagens não podem se mover. Nesse cenário, o algoritmo A* vai ser usado para determinar o caminho de custo mínimo pelo qual um personagem deve se mover desde o quadrado verde (linha 1, coluna 2) até o quadrado vermelho (linha 3, coluna 3). No A*, o custo f(x) de determinado nó x é computado somando-se o custo real g(x) ao custo da função heurística h(x), e a heurística utilizada é a distância de Manhattan (soma das distâncias horizontal e vertical de x até o objetivo). Desse modo, o custo f(x) do quadrado verde é igual a
  • A 2.
  • B 3.
  • C 5.
  • D 7.
  • E 9.
Gabarito: B — No nó inicial, g=0. A heurística de Manhattan ignora os obstáculos: o verde está na linha 1, coluna 2 e o vermelho na linha 3, coluna 3, logo h = |1−3| + |2−3| = 2+1 = 3. Portanto f = g+h = 0+3 = 3. (O custo real do caminho, contornando a barreira preta, é bem maior — o que mostra que a distância de Manhattan é admissível: nunca superestima.)
7
Técnicas de projeto de algoritmos
Divisão e conquista Algoritmos gulosos Prog. dinâmica Backtracking
Q68 ENADE 2014 – Ciência da Computação (Bacharelado) – Discursiva 3
Discursiva
O jogo Sudoku consiste em uma matriz 9×9 dividida em 9 sub-matrizes 3×3. A matrix está parcialmente preenchida com números de 1 a 9 e o objetivo é completar a matrix, de forma que cada linha, coluna e sub-matrix contenham todos os números de 1 a 9.
A partir dessas informações, escreva um algoritmo recursivo baseado em retrocesso (backtracking) para resolver o jogo. A matrix foi transformada em um vetor V de 81 posições, contendo zeros nas posições que faltam para serem preenchidas.
Considere que existem duas funções implementadas. A primeira função, NaoHaViolacao(x,i,V), retorna verdadeiro se a inserção do número x na posição i do vetor V não causa violação das restrições do jogo. A segunda função, Imprime(V), realiza a impressão do vetor V.
Considere, ainda, que o algoritmo deve imprimir o vetor V com a solução encontrada, se esta existir. (valor: 10,0 pontos)
/* chamada inicial: if (!Resolve(V, 0)) printf("Sem solução"); */
int Resolve(int V[], int i) {
    if (i == 81) { Imprime(V); return 1; }  /* todas as posições preenchidas */
    if (V[i] != 0) return Resolve(V, i + 1); /* posição já dada: segue adiante */
    for (int x = 1; x <= 9; x++) {
        if (NaoHaViolacao(x, i, V)) {
            V[i] = x;                /* escolhe */
            if (Resolve(V, i + 1))  /* explora */
                return 1;
            V[i] = 0;               /* desfaz (retrocesso) */
        }
    }
    return 0;                       /* nenhum x serve: volta */
}
Gabarito: Discursiva — Elementos avaliados: caso base (vetor completo → imprime), tratamento das posições fixas, laço de tentativas com NaoHaViolacao, chamada recursiva para a próxima posição e restauração do valor ao retroceder.
Q69 ENADE 2014 – Ciência da Computação (Bacharelado) – Discursiva 5
Discursiva
As técnicas de projeto de algoritmos são essenciais para que os desenvolvedores possam implementar software de qualidade. Essas técnicas descrevem os princípios que devem ser adotados para se projetar soluções algorítmicas para um dado problema. Entre as principais técnicas, destacam-se os projetos de algoritmos por tentativa e erro, divisão e conquista, programação dinâmica e algoritmos gulosos.
Nesse contexto, faça o que se pede nos itens a seguir.
a) Descreva o que caracteriza o projeto de algoritmos por divisão e conquista. (valor: 6,0 pontos)
b) Apresente uma situação de uso da técnica de projeto de algoritmos por divisão e conquista. (valor: 4,0 pontos)
Gabarito: Discursiva — a) A divisão e conquista resolve um problema em três etapas recursivas: (i) Dividir a instância em subproblemas menores, do mesmo tipo e independentes entre si; (ii) Conquistar cada subproblema recursivamente, até chegar a um caso base; (iii) Combinar as soluções dos subproblemas para obter a solução do problema original. O custo costuma ser descrito por T(n) = aT(n/b) + f(n), resolvida pelo Teorema Mestre. Difere da programação dinâmica porque os subproblemas não se sobrepõem. b) Exemplos: mergesort (O(n log n)); quicksort; busca binária; multiplicação rápida de inteiros (Karatsuba); par de pontos mais próximos; cálculo de x^n por exponenciação rápida.
Q70 ENADE 2017 – Ciência da Computação (Bacharelado) – Questão 22
Objetiva
Um país utiliza moedas de 1, 5, 10, 25 e 50 centavos. Um programador desenvolveu o método a seguir, que implementa a estratégia gulosa para o problema do troco mínimo. Esse método recebe como parâmetro um valor inteiro, em centavos, e retorna um array no qual cada posição indica a quantidade de moedas de cada valor.
public static int[] troco(int valor){
    int[] moedas = new int[5];
    moedas[4] = valor / 50;
    valor = valor % 50;
    moedas[3] = valor / 25;
    valor = valor % 25;
    moedas[2] = valor / 10;
    valor = valor % 10;
    moedas[1] = valor / 5;
    valor = valor % 5;
    moedas[0] = valor;
    return(moedas);
}
Considerando o método apresentado, avalie as asserções a seguir e a relação proposta entre elas.
I. O método guloso encontra o menor número de moedas para o valor de entrada, considerando as moedas do país.
PORQUE
II. Métodos gulosos sempre encontram a solução global ótima.
A respeito dessas asserções, assinale a opção correta.
  • A As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I.
  • B As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa correta da I.
  • C A asserção I é uma proposição verdadeira, e a II é uma proposição falsa.
  • D A asserção I é uma proposição falsa, e a II é uma proposição verdadeira.
  • E As asserções I e II são proposições falsas.
Gabarito: C — I – verdadeira. O sistema {1, 5, 10, 25, 50} é canônico: para ele, escolher sempre a maior moeda possível produz o número mínimo de moedas. II – falsa. Algoritmos gulosos fazem escolhas localmente ótimas e nem sempre chegam ao ótimo global. Contraexemplo: moedas {1, 3, 4} e troco 6 — o guloso dá 4+1+1 (3 moedas), mas o ótimo é 3+3 (2 moedas). A correção do guloso depende da estrutura do problema (propriedade da escolha gulosa e subestrutura ótima).
Q71 ENADE 2023 – Engenharia de Computação – Questão 17
Objetiva
Dada uma sequência de caracteres S = s₁,s₂,…,sₙ, uma subsequência de S é dada pela remoção de zero ou mais caracteres de S. O problema da Subsequência Comum Mais Longa (LCS) pressupõe duas sequências de caracteres A = a₁,a₂,…,aₙ e B = b₁,b₂,…,bₘ, de comprimentos n e m, respectivamente.
A partir dessas informações, considere que Z = z₁,z₂,…,zₖ seja uma LCS das sequências A e B. Em relação ao problema da LCS, avalie as afirmações a seguir.
I. Se aₙ = bₘ, então zₖ = aₙ, zₖ = bₘ e Zₖ₋₁ é uma LCS de Aₙ₋₁ e Bₘ₋₁.
II. Se aₙ ≠ bₘ e zₖ ≠ aₙ, então Z é uma LCS de Aₙ₋₁ e B.
III. Seja lcs(i,j) o comprimento da LCS entre Aᵢ e Bⱼ. Para i,j > 0, se aᵢ ≠ bⱼ, então lcs(i,j) = min{lcs(i,j−1), lcs(i−1,j)}.
IV. Seja lcs(i,j) o comprimento da LCS entre Aᵢ e Bⱼ. Para i,j > 0, se aᵢ = bⱼ, então lcs(i,j) = lcs(i−1,j−1) + 1.
É correto apenas o que se afirma em
  • A I e III.
  • B I e IV.
  • C II e III.
  • D I, II e IV.
  • E II, III e IV.
Gabarito: D — I correta: se os últimos caracteres coincidem, eles fazem parte de toda LCS, e o restante é uma LCS dos prefixos sem eles. II correta: se aₙ ≠ bₘ e a LCS não termina em aₙ, então aₙ pode ser descartado: Z é LCS de Aₙ₋₁ e B. III incorreta: quando aᵢ ≠ bⱼ, toma-se o máximo, não o mínimo: lcs(i,j) = max{lcs(i,j−1), lcs(i−1,j)}. IV correta: é o caso de coincidência da recorrência. Recorrência completa: lcs(i,0) = lcs(0,j) = 0; lcs(i,j) = lcs(i−1,j−1)+1 se aᵢ = bⱼ; caso contrário, max{lcs(i,j−1), lcs(i−1,j)}.
Q72 ENADE 2008 – Tecnologia em Análise e Desenvolvimento de Sistemas – Questão 26
Anulada
Os métodos de projeto e análise de algoritmos são necessários para o desenvolvimento de algoritmos eficientes, pois eles permitem que se resolva problemas computacionais, reduzindo complexidade e tempo de execução. Acerca desses métodos, assinale a opção incorreta.
  • A A abordagem de Divisão e Conquista propõe dividir o problema em vários subproblemas, resolvendo-os e combinando suas soluções para criar a solução final do problema original.
  • B A Programação Dinâmica é uma técnica tipicamente aplicada a problemas de otimização em que pode haver várias soluções possíveis.
  • C O método Guloso nem sempre encontra a solução ótima, mas faz sempre a melhor escolha momentânea.
  • D A Programação Dinâmica e o Método Guloso têm em comum o fato de que se aplicam a problemas em que se observa a existência de sobreposição de subproblemas, ou seja, subproblemas que se repetem.
  • E Os métodos de Divisão e Conquista e Programação Dinâmica apresentam a mesma eficiência quando resolvem problemas combinando soluções de subproblemas dependentes uns dos outros.
Gabarito: ANULADA — A questão pede uma opção incorreta, mas há duas: D – incorreta (sobreposição de subproblemas é característica da programação dinâmica; o que PD e guloso têm em comum é a subestrutura ótima); E – incorreta (quando os subproblemas são dependentes e se repetem, a D&C recalcula exponencialmente, enquanto a PD resolve cada um uma vez). A, B e C estão corretas. Com duas respostas possíveis, a questão foi anulada.
Q73 ENADE 2011 – Computação (todas as áreas) – Questão 13
Anulada
O problema do escalonamento de intervalos tem como entrada um conjunto de intervalos numéricos (usualmente interpretados como início e fim de atividades), e o objetivo é escolher, desse conjunto, o maior número possível de intervalos disjuntos de dois a dois.
O problema do escalonamento de intervalos pode ser resolvido com o algoritmo descrito a seguir. O conjunto de intervalos dados inicialmente é R e o conjunto de intervalos escolhidos, A, começa vazio.
enquanto R não estiver vazio,
    seja x o intervalo de R com menor tempo de término, e que não tenha interseção com
    algum intervalo em A
    retire x de R e adicione ao conjunto A
retorne A
A respeito desse algoritmo, analise as seguintes asserções.
Para checar se o algoritmo está correto, basta verificar que o primeiro intervalo adicionado ao conjunto A necessariamente faz parte de uma solução ótima.
PORQUE
Pode-se mostrar, por indução no número máximo de intervalos calculados (ou seja, o número de vezes que o laço "enquanto" é executado), que embora possa haver soluções tão boas quanto A, nenhuma delas é estritamente melhor que A. O conjunto com um único intervalo é a base de indução.
  • A As duas asserções são proposições verdadeiras, e a segunda é uma justificativa correta da primeira.
  • B As duas asserções são proposições verdadeiras, mas a segunda não é uma justificativa correta da primeira.
  • C A primeira asserção é uma proposição verdadeira, e a segunda, uma proposição falsa.
  • D A segunda asserção é uma proposição falsa e a segunda, uma proposição verdadeira.
  • E Tanto a primeira quanto a segunda asserções são proposições falsas.
Gabarito: ANULADA — O algoritmo é o clássico guloso por menor tempo de término (activity selection, Cormen cap. 16), que é ótimo. A primeira asserção diz que "basta" verificar a escolha inicial (sem a subestrutura ótima não basta, mas com a indução da segunda asserção a verificação se estende a todas as escolhas), e a redação da opção D tem erro de digitação ("a segunda asserção…e a segunda"). A questão foi anulada.
Q74 ENADE 2011 – Computação (todas as áreas) – Questão 28
Objetiva
Algoritmos criados para resolver um mesmo problema podem diferir de forma drástica quanto a sua eficiência. Para evitar este fato, são utilizadas técnicas algorítmicas, isto é, conjunto de técnicas que compreendem os métodos de codificação de algoritmos de forma a salientar sua complexidade, levando-se em conta a forma pela qual determinado algoritmo chega à solução desejada.
Considerando os diferentes paradigmas e técnicas de projeto de algoritmos, analise as afirmações abaixo.
I. A técnica de tentativa e erro (backtracking) efetua uma escolha ótima local, na esperança de obter uma solução ótima global.
II. A técnica de divisão e conquista pode ser dividida em três etapas: dividir a instância do problema em duas ou mais instâncias menores; resolver as instâncias menores recursivamente; obter a solução para as instâncias originais (maiores) por meio da combinação dessas soluções.
III. A técnica de programação dinâmica decompõe o processo em um número finito de subtarefas parciais que devem ser exploradas exaustivamente.
IV. O uso de heurísticas (ou algoritmos aproximados) é caracterizado pela ação de um procedimento chamar a si próprio, direta ou indiretamente.
É correto apenas o que se afirma em
  • A I.
  • B II.
  • C I e IV.
  • D II e III.
  • E III e IV.
Gabarito: B — I incorreta: "escolha ótima local na esperança do ótimo global" é a definição do método guloso. O backtracking explora as alternativas e retrocede quando uma escolha não leva à solução. II correta: são as três etapas da divisão e conquista: dividir, conquistar, combinar. III incorreta: a exploração exaustiva de subtarefas descreve a força bruta ou o backtracking; a programação dinâmica resolve cada subproblema uma única vez e reaproveita o resultado. IV incorreta: "procedimento que chama a si próprio" é a definição de recursão, não de heurística.
8
Lógica de programação com vetores e matrizes
Vetores (arrays) Matrizes Rastreamento de código Lógica e operadores
Q75 ENADE 2014 – Sistemas de Informação – Questão 9
Objetiva
Considere uma situação em que um professor que queira saber se existem alunos cursando, ao mesmo tempo, as disciplinas A e B, tenha implementado um programa que: (1) inicializa um array a de 30 posições que contém as matrículas dos alunos da disciplina A; (2) inicializa outro array b de 40 posições, que contém as matrículas dos alunos da disciplina B; (3) imprime a matrícula dos alunos que estão cursando as disciplinas A e B ao mesmo tempo.
Considere, ainda, que os arrays foram declarados e inicializados, não estão necessariamente ordenados, e seus índices variam entre 0 e n−1, sendo n o tamanho do array.
1. for ( i = 0 to 29 ) {
2.     for ( j = 0 to 39 ) {
3.
4.
5.
6.     }
7. }
Com base nessas informações, conclui-se que o trecho a ser incluído nas linhas 3, 4 e 5 do código acima, para que o programa funcione corretamente, é
  • A 3. if (a[i] == b[j]) { 4. print(a[i]); 5. }
  • B 3. if (a[j] == b[i]) { 4. print(a[j]); 5. }
  • C 3. if (a[i] == b[j]) { 4. print(a[j]); 5. }
  • D 3. if (a[i] == b[i]) { 4. print(a[i]); 5. }
  • E 3. if (a[j] == b[j]) { 4. print(a[j]); 5. }
Gabarito: A — O índice i percorre a (0 a 29) e j percorre b (0 a 39). Como os vetores não estão ordenados, é preciso comparar cada a[i] com cada b[j] e imprimir o valor comum, a[i] (ou b[j], que é igual). B e E usam a[j] com j até 39, acessando fora dos limites de a; C imprime a[j], que é outro aluno; D compara posições iguais dos dois vetores, o que só funcionaria se estivessem alinhados. Custo: 30×40 comparações, O(n·m).
Q76 ENADE 2017 – Sistemas de Informação – Discursiva 4
Discursiva
A figura a seguir representa uma plantação de café com x colunas e y linhas. Nessa figura, as regiões com os cafeeiros plantados são as que estão com os espaços preenchidos, e as regiões com falhas de plantios são as que apresentam seus espaços vazios.
Considerando uma solução algorítmica para contar a quantidade de falhas de plantio do cafezal representado na figura, faça o que se pede nos itens a seguir.
a) Indique o tipo de estrutura de dados utilizada na solução, justificando a sua resposta. (valor: 4,0 pontos)
b) Escreva o algoritmo da solução em pseudocódigo ou em linguagem de programação. (valor: 6,0 pontos)
Gabarito: Discursiva — a) Matriz (bidimensional), pois a estrutura é de natureza bidimensional e o problema é a contagem das regiões com falhas de plantio. Também aceito: Lista, pois permite contar as regiões com falhas, embora não considere diretamente a bidimensionalidade. b) Exemplo:
int contaFalhas(int y, int x, int cafezal[y][x]) {
    int falhas = 0;
    for (int i = 0; i < y; i++)
        for (int j = 0; j < x; j++)
            if (cafezal[i][j] == 0)
                falhas++;
    return falhas;
}
Para a figura (y=3, x=5, 6 cafeeiros), o algoritmo retorna 15−6=9 falhas. Complexidade: Θ(x·y). Padrão INEP disponível na prova oficial.
Q77 ENADE 2017 – Sistemas de Informação – Questão 26
Objetiva
Algumas linguagens de programação obedecem a uma ordem específica no que diz respeito à avaliação de operadores. A precedência dos operadores aritméticos, relacionais e booleanos é demonstrada na tabela a seguir, na qual os operadores ++ e −−, pré ou pós-fixados, incrementam ou decrementam a variável, como no exemplo: variável x com valor 0, resultado de ++x é igual a 1 e o de --x é igual a −1.
Considerando essas informações e sabendo que as variáveis a, b e c têm, em determinado momento, os valores 1, 2 e 0, respectivamente, assinale a opção em que o resultado da expressão apresentada corresponde ao da expressão -a * ++b - --c.
  • A a * b++ - --c
  • B --b > a * c
  • C --c/a * --b
  • D ++c/--b * ++a
  • E -a * b++ - c--
Gabarito: E — Expressão de referência (a=1, b=2, c=0): −a·(++b)−(−−c) = (−1)·3−(−1) = −3+1 = −2. A: 1·2−(−1) = 3. B: (−−b=1) > (1·0=0) → verdadeiro (1). C: (−1)/1·1 = −1. D: 1/1·2 = 2. E: (−1)·2−0 = −2 (pós-fixados usam os valores antigos: b=2, c=0). ✓
Q78 ENADE 2021 – Tecnologia em Análise e Desenvolvimento de Sistemas – Discursiva 3
Discursiva
Considere a realização de uma pesquisa com 1 000 pessoas para obtenção das seguintes informações: o valor da maior altura; o valor da menor altura; a média das alturas; quantas pessoas têm altura inferior à média das alturas.
Considere, ainda, que um programador foi selecionado para desenvolver um modelo de código que soluciona o problema automatizando a coleta das alturas e a geração das informações.
Com base nas informações apresentadas, desenvolva o código adequado para resolver o problema usando pseudocódigo ou uma linguagem de programação. (valor: 10,0 pontos)
Gabarito: Discursiva — Ponto central: a quantidade abaixo da média só pode ser contada depois de conhecida a média; por isso as alturas precisam ser guardadas num vetor e percorridas duas vezes. Exemplo:
algoritmo "pesquisa"
var altura[1000], menor, maior, total=0, media: real
var qtdmenor=0, ctpessoas: inteiro
inicio
leia altura[1]
menor = altura[1]
maior = altura[1]
total = altura[1]
para ctpessoas=2 até 1000 faça
    leia (altura[ctpessoas])
    total = total + altura[ctpessoas]
fimpara
media = total/1000
para ctpessoas=1 até 1000 faça
    se menor > altura[ctpessoas] então menor = altura[ctpessoas]
    se maior < altura[ctpessoas] então maior = altura[ctpessoas]
    se media > altura[ctpessoas] então qtdmenor = qtdmenor + 1
fimpara
escreva ("Maior = ", maior, " Menor= ", menor, " Média= ", media,
         " Quantidade de alturas menores que a média= ", qtdmenor)
Complexidade: Θ(n). Padrão INEP disponível na prova oficial.
Q79 ENADE 2005 – Computação (Sistemas de Informação) – Questão 14
Objetiva
Os proprietários de um teatro necessitam de uma ferramenta de software para reserva de lugares. O desenvolvedor contratado verificou que as poltronas disponíveis para reserva são referenciadas pelo número da fila (a partir do n.º 1) e pelo número da cadeira (a partir do n.º 1) em cada fila, em uma representação matricial em que as linhas e colunas da matriz correspondem, respectivamente, às filas e às colunas de cadeiras. Embora o contexto seja o da organização matricial — N filas de cadeiras (linhas), cada uma contendo M cadeiras (colunas) —, a solução a ser implementada utilizará uma estrutura linear unidimensional (vetor), sendo, portanto, necessária uma conversão entre o lugar referenciado (número f da fila, número c da cadeira) e a posição real na estrutura de armazenamento (posição p no vetor).
Na situação apresentada, considere que a referida matriz seja armazenada no vetor segundo sua sequência de linhas, da primeira para a última, e, em cada linha, da primeira coluna para a última, e que a primeira posição no vetor tenha índice 0. Nessa situação, a posição p da poltrona do teatro localizada à fila de número f e à coluna de número c, é igual a
  • A c + f × M.
  • B f + c × M.
  • C M × (f − 1) + (c − 1).
  • D M × (c − 1) + (f − 1).
  • E M × (c − 1) + M × f.
Gabarito: C — No armazenamento por linhas (row-major), antes da fila f vêm f−1 filas completas, cada uma com M cadeiras: M×(f−1) posições. Dentro da fila, a cadeira c está deslocada c−1 posições (porque a numeração começa em 1 e o vetor em 0). Logo p = M(f−1)+(c−1). Teste: fila 1, cadeira 1 → p=0; fila 2, cadeira 1 → p=M.
Q80 ENADE 2008 – Tecnologia em Análise e Desenvolvimento de Sistemas – Questão 21
Objetiva
 1 Algoritmo ENADE2008
 2 variaveis
 3     varA, varB, varC: inteiro
 4     varF : real
 5     varS : literal
 6     varL : logico
 7 inicio
 8     varS ← "1000"
 9     varA ← 4
10     varF ← 3.5
11     varC ← 0
12     varL ← VERDADEIRO
13     se((varC < varA) E varL OU (varS > varC)) entao
14         varB ← varF/varA
15     senao
16         varB ← varA/varC
17     fim se
18 fim algoritmo
O código acima
  • A não apresenta erros de nenhum tipo.
  • B apresenta erros de atribuição de tipo inválido, divisão por zero e expressão relacional inválida.
  • C apresenta erros de atribuição de tipo inválido, divisão por zero e estrutura condicional.
  • D apresenta erros de estrutura condicional e expressão relacional inválida.
  • E apresenta somente erro de divisão por zero.
Gabarito: B — Atribuição de tipo inválido (linha 14): varF/varA é real, mas varB é inteiro. Divisão por zero (linha 16): varA/varC com varC = 0. Expressão relacional inválida (linha 13): varS > varC compara um literal (texto "1000") com um inteiro. A estrutura se … entao … senao … fim se está correta.
Q81 ENADE 2008 – Tecnologia em Análise e Desenvolvimento de Sistemas – Discursiva 40
Anulada
 1 Algoritmo MatrizENADE2008
 2 variaveis
 3     M[0..2][0..3], I, J, C : inteiro
 4 inicio
 5     C ← 0
 6     para I ← 0 ate 2 passo 1 faca
 7     inicio
 8         para J ← 0 ate 3 passo 1 faca
 9         inicio
10             C ← C + 1
11             M[I][J] ← C
12         fim para
13     fim para
14     para I ← 0 ate 2 passo 1 faca
15     inicio
16         para J ← 0 até 3 passo 1 faca
17         inicio
18             C ← M[2-I][3-J]
19             M[I][J] ← C
20         fim para
21     fim para
22 fim algoritmo
Considerando a execução do algoritmo apresentada acima, faça o que se pede a seguir.
A) Apresente os dados da matriz M ao término da execução da linha 12. (valor: 4,0 pontos)
B) Apresente os dados da matriz M ao término da execução da linha 19. (valor: 6,0 pontos)
Gabarito: ANULADA — A) Após linha 12: M = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]. B) A cópia é feita na própria matriz, sem auxiliar. Linha 0: recebe de M[2][3..0] → [12,11,10,9]. Linha 1: M[1][0..3] ← M[1][3..0]: M[1][0] recebe M[1][3]=8; M[1][1] recebe M[1][2]=7; mas M[1][2] copia M[1][1] que já foi sobrescrito com 7; idem M[1][3]. Linha 2: vem da linha 0, já alterada. Resultado: [[12,11,10,9],[8,7,7,8],[9,10,11,12]]. Observação: o gabarito definitivo de 2008 anulou a Discursiva 40; o padrão de resposta publicado traz a solução sob o rótulo "Discursiva 39".
Q82 ENADE 2011 – Tecnologia em Análise e Desenvolvimento de Sistemas – Discursiva 4
Discursiva
Considerando a execução do algoritmo abaixo, responda ao que se pede nos itens a e b.
01 algoritmo Vetores
02 variaveis
03     vetA[1..10], vetB[1..10], i: inteiro
04 inicio
05     para i <- 1 ate 10 passo 1 faca
06         vetB[i] <- 0
07         se resto(i,2) = 0 entao
08             vetA[i] <- i
09         senão
10             vetA[i] <- 2 * i
11         fimse
12     fimpara
13     para i <- 1 ate 10 passo 1 faca
14         enquanto(vetA[i] > i)
15             vetB[i] <- vetA[i]
16             vetA[i] <- vetA[i] - 1
17         fimenquanto
18     fimpara
19 fimalgoritmo
a) Apresente os dados dos vetores vetA e vetB ao término da execução da linha 12. (valor: 5,0 pontos)
b) Apresente os dados dos vetores vetA e vetB ao término da execução da linha 19. (valor: 5,0 pontos)
Gabarito: Discursiva — a) Após linha 12: vetA=[2,2,6,4,10,6,14,8,18,10], vetB=[0,0,0,0,0,0,0,0,0,0]. b) Após linha 19: vetA=[1,2,3,4,5,6,7,8,9,10], vetB=[2,0,4,0,6,0,8,0,10,0]. Justificativa: No primeiro laço, posições pares recebem i e ímpares recebem 2i. No segundo, o enquanto decrementa vetA[i] até chegar a i; só as posições ímpares entram no laço, e vetB[i] guarda o último valor antes do decremento final, isto é, i+1.
Q83 ENADE 2011 – Tecnologia em Análise e Desenvolvimento de Sistemas – Discursiva 5
Discursiva
Jogos de tabuleiro são atividades comuns de entretenimento na vida cotidiana das pessoas. No livro O Homem que Calculava, de Malba Tahan, há uma história na qual um rei deveria efetuar o pagamento pelos serviços de um de seus conselheiros, dando-lhe uma certa quantidade de grãos de trigo a ser calculada da seguinte forma: coloca-se 1 grão de trigo na primeira casa do tabuleiro, 2 na segunda casa, 4 na terceira casa, 8 na quarta casa e assim dobrando-se sucessivamente até a última casa.
Considerando o tabuleiro 4×4 ilustrado acima, contendo a indicação da ordem das casas, construa um único algoritmo que:
a) calcule, armazene em uma estrutura e escreva em ordem a quantidade de grãos de trigo em cada casa do tabuleiro; (valor: 8,0 pontos)
b) calcule, armazene em uma variável e escreva a quantidade total de grãos de trigo presentes no tabuleiro. (valor: 2,0 pontos)
Gabarito: Discursiva — Padrão INEP:
inicio
  tipo Trigo = vetor [1..16] de inteiros;
  inteiro: TotalTrigo, Indice1;
  TotalTrigo <- 0;
  Para Indice1 de 0 até 15 passo 1 faça
      Trigo[Indice1 + 1] <- pot(2, Indice1);
      TotalTrigo <- TotalTrigo + Trigo[Indice1 + 1];
  Fim para;
  Para Indice1 de 1 até 16 passo 1 faça
      Escreva("Quantidade de grãos de trigo na casa ", Indice1, " = ", Trigo[Indice1]);
  Fim para;
  Escreva("Total de grãos de trigo no tabuleiro = ", TotalTrigo);
Fim.
Total: ∑ₖ₌₀¹⁵ 2ᵏ = 2¹⁶−1 = 65 535 grãos. Otimização: em vez de pot(2, i), pode-se dobrar o valor da casa anterior (Trigo[i] ← 2 * Trigo[i-1]), evitando a função de potência.
← Voltar às Disciplinas Baixar PDF original

Sobre esta compilação

Disciplinas relacionadas Estruturas de Dados · Linguagem de Programação I
Curso BSI – Bacharelado em Sistemas de Informação
Edições cobertas 2005, 2008, 2011, 2014, 2017, 2019, 2021 e 2023
Total de questões 83 questões (67 objetivas · 16 discursivas · 4 anuladas)
Organização 8 capítulos temáticos conforme material didático IFBA
Autora da compilação Profª Ana Carolina Sokolonski Anton · IFBA – Feira de Santana