HarmonyFidelisHarmonyFidelis
Entrar
NotíciasGrandes projetosAtoresAcademia

Algoritmos: especificar, executar e justificar uma busca pelo máximo

Do contrato à prova: acompanhe uma busca pelo máximo, teste seus limites e distinga método, programa, correção e terminação.

Algoritmos: especificar, executar e justificar uma busca pelo máximo

1. Objetivos, nível e pré-requisitos

  • Definir as entradas permitidas e a saída exigida de um algoritmo.
  • Registrar a execução de uma busca pelo máximo com uma variável, uma condição e um laço.
  • Justificar a correção e a terminação e, depois, distinguir prova e testes.

Um algoritmo descreve um método preciso para transformar dados de entrada em um resultado. Aqui, estudamos algoritmos determinísticos que devem terminar para toda entrada permitida. Um programa expressa esse método em uma linguagem que uma máquina pode executar; um mesmo método pode ter vários programas.

Ao final desta introdução, você poderá especificar as entradas e a saída esperada, acompanhar os valores de uma variável e justificar por que uma busca pelo máximo termina e produz o resultado correto. Essa competência serve para verificar um procedimento em vez de confiar em uma saída plausível.

Nível: iniciante. Basta comparar números inteiros e ler uma sequência ordenada de valores, chamada aqui de lista. Números negativos são permitidos. Nenhuma linguagem de programação é necessária: comece no papel. A passagem para o código é uma aplicação, não um pré-requisito oculto.

2. Definir o problema antes do método

Buscamos o maior valor de uma lista finita não vazia de inteiros. A entrada pode conter repetições e não precisa estar ordenada. A saída é um valor, não sua posição nem o número de vezes que aparece. Para [3, 7, 7, 2], o resultado esperado é 7.

A condição “não vazia” é uma pré-condição: ela especifica as entradas permitidas. A pós-condição expressa o resultado exigido: a saída pertence à lista e é maior ou igual a cada um de seus valores. Em uma lista vazia, não existe máximo a retornar. Um procedimento destinado a aceitar também esse caso deveria definir explicitamente um erro ou outro resultado; não deveria inventar zero.

3. Construir um procedimento sem ambiguidade

Mantenha um candidato chamado best. Inicialize-o com o primeiro valor e percorra os demais na ordem em que aparecem. Se o valor examinado for estritamente maior que best, substitua best por esse valor. Caso contrário, mantenha-o. Depois do último valor, retorne best.

A atribuição altera um valor armazenado: best ← x significa “armazenar o valor atual de x em best”. Não é uma equação válida para sempre. Uma condição escolhe a ação; um laço repete as etapas para os valores restantes. A ordem, a inicialização e a condição fazem parte do método tanto quanto o resultado final.

best ← primeiro valor da lista
para cada valor x após o primeiro:
    se x > best:
        best ← x
retornar best

Esse texto é pseudocódigo: descreve o método sem impor a sintaxe de uma linguagem. Não deve ser colado dessa forma em um interpretador Python.

Ilustração conceitual de uma lista de quatro valores e um valor guardado na memória.

Ilustração gerada com apoio de inteligência artificial. Ela sugere o papel da memória; o rastreamento numérico exato e sua justificativa estão no texto e na tabela.

4. Acompanhar um exemplo resolvido

Para [3, 7, 7, 2], a inicialização produz best = 3. Restam três valores a comparar.

Valor examinadobest antesx > best?best depois
73sim7
77não7
27não7

A segunda ocorrência de 7 não altera o valor do máximo. O resultado é 7 após exatamente três comparações. Com um único valor, o laço não é executado e esse valor é retornado. Contar as comparações não é medir o tempo real de execução: este também depende do programa e da máquina.

5. Justificar a correção e a terminação

Após cada etapa, best é o máximo da parte já percorrida. Essa propriedade preservada é chamada de invariante. Ela é verdadeira no início, pois a parte percorrida contém apenas o primeiro valor. Se o próximo valor for maior, substituir o candidato preserva a propriedade; caso contrário, manter o candidato também a preserva. Ao final, a parte percorrida é a lista inteira: portanto, a pós-condição é satisfeita.

Uma lista finita de n valores deixa n − 1 valores após o primeiro. Cada etapa processa um deles, sem voltar atrás: a quantidade restante diminui até zero. Isso justifica a terminação e n − 1 comparações, mesmo que todos os valores sejam iguais. Testes com exemplos podem revelar um erro; eles não substituem essa justificativa para todas as entradas permitidas.

6. Traduzir para um programa Python

Esta é uma tradução para uma lista não vazia de inteiros. values[0] indica seu primeiro valor; range(1, len(values)) percorre os índices posteriores. A indentação delimita o laço e a condição.

PYTHON
def maximum(values):
    best = values[0]
    for i in range(1, len(values)):
        x = values[i]
        if x > best:
            best = x
    return best

Essa função pressupõe que a pré-condição seja satisfeita. Ela não constitui uma interface completa de validação de entradas: a lista vazia provoca um erro ao acessar values[0]. Valores ausentes, misturas de tipos e listas infinitas ficam fora do problema definido. Antes de reutilizá-la, especifique o contrato e o tratamento das entradas rejeitadas. O código visa à compreensão do método; na prática, uma função de máximo integrada pode ser preferível.

7. Exercício guiado

Registrar a execução de uma busca pelo máximo

Para [5, 1, 9, 3], execute o procedimento à mão. Construa uma tabela com o valor examinado, best antes e best depois; indique a saída e o número de comparações.

Critério de sucesso : O registro de execução inicializa best com o primeiro valor, examina cada um dos demais valores uma vez e explica a decisão em cada comparação.

Resolução guiada, a consultar após sua tentativa: o candidato começa em 5; após 1, 9 e 3, vale sucessivamente 5, 9 e 9. Três comparações levam à saída 9. Cada linha deve mostrar o valor examinado, o candidato antes e o candidato depois; uma saída correta, por si só, não basta para explicar o raciocínio.

8. Projeto proporcional

Especificar e testar um procedimento

Para [12, 8, 15, 15, 4], redija a pré-condição e a pós-condição, registre a execução da busca pelo máximo e justifique a terminação. Acrescente os testes [-4, -2, -9], [6] e [3, 3]. Explique o tratamento previsto para uma lista vazia e por que inicializar com zero é perigoso.

Critério de sucesso : A entrega contém um contrato explícito, os quatro registros de execução, um argumento do invariante e uma justificativa do término. Ela distingue as entradas permitidas do caso vazio rejeitado.

Trabalhe primeiro no papel. Se depois usar o programa, compare a saída dele com seu registro de execução. A concordância nesses poucos casos é uma verificação limitada; mantenha também o argumento do invariante e a justificativa de terminação. A entrega é uma pequena especificação acompanhada dos registros de execução e dos testes, sem coleta de dados pessoais.

9. Avaliação de transferência

Transferir o método para um mínimo

Adapte o procedimento para buscar o mínimo de uma lista finita não vazia de inteiros. Apresente o pseudocódigo, registre a execução para [6, -1, 4, -1] e explique a propriedade preservada e a terminação. Encontre um contraexemplo à inicialização com zero e, depois, esclareça por que uma lista vazia permanece fora do contrato.

Critério de sucesso : O método funciona em todo o domínio anunciado, trata as repetições e o caso de um único elemento, separa teste e prova e justifica a inicialização, a comparação e o término sem repetir uma regra memorizada sem explicação.

Redija sua justificativa sem consultar anotações, explicando cada escolha. Depois, compare seu método com a busca pelo máximo: quais etapas se mantêm e qual decisão muda?

10. Limites e erros frequentes

Inicializar best com zero parece funcionar para algumas listas de valores positivos, mas falha em [-4, -2, -9]: o programa então retorna 0, que nem sequer pertence à entrada. Inicializar com o primeiro valor evita essa hipótese oculta. Uma lista com um único elemento e as repetições são casos permitidos, não anomalias.

O máximo de uma lista não é sua soma nem um valor que necessariamente apareça apenas uma vez na lista. Um algoritmo pode ser correto sem ser o único possível. Outro método poderia ordenar a lista antes de escolher o último elemento, mas isso acrescenta trabalho desnecessário para esta única questão. Esta unidade não prova que um procedimento qualquer termina nem que um programa qualquer respeita seu método: essas duas propriedades exigem argumentos próprios.

11. Síntese, recuperação ativa e próxima etapa

O caminho é: definir o contrato, escolher um método, registrar a execução de um caso, justificar a propriedade preservada e o término, e depois verificar a tradução. Uma saída plausível não é uma prova geral. Retome amanhã, sem reler, estas quatro perguntas:

  1. Que diferença você faz entre um algoritmo e um programa?
  2. Para [2, 5, 4], quais valores o candidato assume e quantas comparações são feitas?
  3. Por que a inicialização com zero falha para algumas entradas?
  4. Explique a um iniciante por que o procedimento termina em toda lista finita não vazia.

Referência breve: o método é distinto de sua tradução; o registro de execução começa em 2, passa a 5 e depois permanece em 5, com duas comparações. O zero impõe indevidamente um limite inferior aos valores. O número de elementos que restam a processar diminui de um em um até zero.

Próxima etapa proposta: comparar a busca por um valor em uma lista com a busca pelo seu máximo. Nenhum curso seguinte foi designado ainda: esta raiz permanece aberta a uma extensão do percurso de aprendizagem, após a qualificação do grafo.

12. Fontes e método editorial

Esta unidade original aproxima dois programas institucionais independentes: o programa francês de numérique et sciences informatiques, première, BO de 22 de janeiro de 2019, anexo p. 8 “Langages et programmation” e p. 9 “Algorithmique”, e o programa inglês de computing, 2013, “Key stage 2” e “Key stage 3”. Fontes relidas em 12 de outubro de 2026. O alinhamento abrange especificação, sequência, seleção, repetição, testes e justificativa; não certifica a cobertura integral desses programas.

O texto, os exemplos e as atividades foram preparados com assistência de inteligência artificial. Os registros de execução e os casos de cálculo devem ser verificados, assim como as oito versões linguísticas, antes da entrega pública. Não se afirma nenhum ganho de aprendizagem nem revisão humana.