Considere a seguinte função busca escrita em linguagem C:   ...

Próximas questões
Com base no mesmo assunto
Q508548 Programação
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
Alternativas

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