Considere a seguinte função busca escrita em linguagem C: ...
bool busca(int vetor[ ], int n, int tam)
{
int ini=0, mid;
while (ini <= tam)
{
mid = (ini + tam)/2;
if (vetor[mid] == n)
return true;
else
if (n > vetor[mid])
ini = mid+1;
else
tam = mid-1;
}
return false;
}
Essa função implementa o algoritmo de busca
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - binária iterativa.
Vamos analisar o código apresentado para entender o algoritmo implementado pela função busca
. O algoritmo de busca binária procura um elemento específico dentro de um vetor ordenado dividindo o problema pela metade a cada iteração. No código, isso é feito pelo cálculo de mid = (ini + tam) / 2
, onde mid
representa a posição do meio do vetor ou subvetor que está sendo considerado atualmente.
A busca binária possui duas variantes principais: iterativa e recursiva. A versão iterativa usa uma estrutura de loop, como o while
, para repetir o processo de divisão, enquanto a versão recursiva chama a si mesma com novos limites até encontrar o elemento desejado ou concluir que ele não está presente.
No código fornecido, a condição de parada do loop while
é ini <= tam
, o que significa que ele continuará se repetindo enquanto o intervalo de busca não se tornar inválido (ou seja, enquanto o início for menor ou igual ao fim). Dentro do loop, se o valor buscado n
for encontrado na posição mid
, a função retorna true. Caso contrário, ela ajusta o intervalo de busca (ini
ou tam
) de acordo com o valor de n
em relação ao elemento na posição mid
. Isto é feito sem chamadas recursivas, portanto, a função é iterativa.
Por ser uma busca binária (devido à divisão do intervalo de busca pela metade a cada iteração) e por utilizar um método iterativo (loop while
em vez de chamadas recursivas), a opção correta é a binária iterativa.
As outras opções são incorretas porque:
- Sequencial recursiva: A busca sequencial verifica cada elemento do vetor um por um e poderia ser implementada recursivamente, mas não é o caso do código apresentado.
- Binária recursiva: A busca binária pode ser implementada de forma recursiva, mas o algoritmo fornecido é iterativo, não recursivo.
- Sequencial iterativa: Na busca sequencial iterativa, percorre-se o vetor elemento por elemento em uma sequência linear, o que difere do método de divisão pela metade usado no código.
Assim, é essencial entender os princípios da busca binária e distinguir entre implementações iterativas e recursivas para resolver corretamente questões como esta.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
//Implementação Iterativa:
int PesquisaBinaria (int vet[], int chave, int Tam)
{
int inf = 0; // limite inferior (o primeiro índice de vetor em C é zero)
int sup = Tam-1; // limite superior (termina em um número a menos. 0 a 9 são 10 números)
int meio;
while (inf <= sup)
{
meio = (inf + sup)/2;
if (chave == vet[meio])
return meio;
if (chave < vet[meio])
sup = meio-1;
else
inf = meio+1;
}
return -1; // não encontrado
Fonte: https://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria
LETRA B
bool busca(int vetor[ ], int n, int tam)
{
int ini=0, mid;
while (ini <= tam) -> A Recursividade geralmente é usada para eliminar laço FOR ou WHILE(menos frequente), logo temos um iteração
{
mid = (ini + tam)/2; - Aqui nós temos a divisão do Vetor, logo não há como ser sequencial
if (vetor[mid] == n)
return true;
else
if (n > vetor[mid])
ini = mid+1;
else
tam = mid-1;
}
return false;
}
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo