Questão 1: Crie uma função listar_quadrados_impares(n) que receba um limite n e retorne uma lista com os quadrados dos números ímpares (ex:
) que sejam menores que n .
Exemplo: listar_quadrados_impares(50) deve retornar [1, 9, 25, 49].
Passo 1
O enunciado pede que eu crie uma função chamada e retorna uma lista com os quadrados dos números ímpares — isto é, os valores
listar_quadrados_impares(n) que recebe um limite
— que sejam menores que
.
Informações importantes dadas:
- A função recebe um único parâmetro
. - Devemos considerar apenas números ímpares.
- Devemos calcular o quadrado de cada ímpar e incluir na lista somente se esse quadrado for menor que
. - Exemplo fornecido: chamar
listar_quadrados_impares(50)deve retornar a lista.
Passo 2
Entendendo o que é “número ímpar” e como representá-lo:
- Um inteiro é ímpar quando deixa resto
na divisão por , ou seja, seu módulo por é . - Todos os ímpares não-negativos podem ser escritos como
com inteiro e . Exemplos: para temos ; para temos ; etc.
Como é o quadrado de um ímpar:
- Se um ímpar é
, seu quadrado é
Mas não precisamos necessariamente usar essa fórmula explícita para implementar a função — é só para entender a forma dos valores que vamos gerar.
Passo 3
Condição que define se incluímos o quadrado na lista:
- Queremos todos os quadrados
tais que
- Isso implica que os ímpares que testamos satisfazem
, ou seja, o maior ímpar a testar é menor que . Na prática, em código, é mais simples/econômico gerar ímpares e testar se o quadrado é menor que até que deixem de ser.
Passo 4
Estratégia de implementação (escolha do método):
- Método simples e direto (fácil de aplicar numa prova sem muita matemática avançada): começar em
(o primeiro ímpar), calcular e, enquanto , adicionar à lista e incrementar para o próximo ímpar usando . - Vantagens desse método:
- É muito claro e fácil de implementar.
- Não exige cálculo prévio de
nem conversões de tipos. - Tem custo proporcional ao número de quadrados menores que
, ou seja, cerca de operações — suficiente e eficiente para o objetivo da questão.
- Alternativa (opcional): usar compreensão de listas com
range(1, int(math.sqrt(n))+1, 2); funciona também, mas envolve calcular a raiz quadrada primeiro. Preferi a versão comwhilepor ser direta e segura em relação a arredondamentos.
Passo 5
Detalhes do algoritmo passo a passo (para você repetir na prova):
- Inicializar uma lista vazia
resultado = []. - Inicializar a variável
i = 1(primeiro ímpar). - Enquanto
i * i < n:- Calcular
quadrado = i * i. - Acrescentar
quadradoà listaresultado. - Avançar para o próximo ímpar com
i = i + 2.
- Calcular
- Quando o laço terminar, retornar
resultado.
Observações úteis para a prova:
- Se
, a condição falha desde o início e a função deve retornar lista vazia. - Testes rápidos:
- Para
: geramos , , , ; já não é menor que , então paramos — resultado . - Para
: nenhum quadrado é menor que → resultado . - Para
: apenas → resultado .
- Para
Passo 6
Complexidade e comportamento:
- Número de iterações aproximado: quantos ímpares têm quadrado menor que
? Se então . Como pulamos de 2 em 2, número de iterações é aproximadamente . Portanto a complexidade é . - O algoritmo usa espaço extra proporcional à quantidade de quadrados que retornamos (também
).
Resposta
def listar_quadrados_impares(n):
resultado = []
i = 1
while i * i < n:
resultado.append(i * i)
i += 2
return resultado