sábado, 17 de outubro de 2009

Problema 3.1

Este é um problema muito fácil em todas as suas alíneas. Chama a atenção para a necessidade de sabermos o que existe, de básico, na linguagem Python sobre listas, para assim evitarmos alguns incómodos. Comecemos pela alinea 5. em que nos é pedido para determinar o menor e o maior elemento existente numa lista. Admitamos que se trata de números. A solução trivial é:


def idades_5c(lista):
return max(lista), min(lista)


Mas,e se não soubermos que essas operações primitivas existem? Programamos nós a solução!


def idades_5d(lista):
menor = lista[0]
maior = lista[0]

for indice in range(1,len(lista)):
if lista[indice] < menor :
menor = lista[indice]
if lista[i] > maior:
maior = lista[indice]
return maior,menor


O código acima começa por ter um pressuposto: alista tem pelo menos um elemento. Altere por forma a que essa limitação desapareça. Começamos por aceitar que o maior e o menor coincidem com o primeiro elemento. Depois, percorremos todos os elementos, de modo sequencial, da esquerda para a direita e comparamos com os nossos maior e menor. Actualizamos de acordo. A alínea 6. (cálculo da soma dos valores na lista) é ainda mais fácil.


def idades_6a(lista):
return sum(lista)

def idades_6b(lista):
soma=0
for indice in range(len(lista)):
soma=soma+ [lista[indice]]
return soma

def idades_6c(lista):
soma=0
for elem in lista:
soma=soma+elem
return soma


A primeira solução (6a), é directa e emprega a operação sum. A segunda (6b), usa um acumulador, a variável soma. Começa por ser zero e em cada etapa do ciclo é actualizada com o acréscimo de mais um elemento. A terceira solução (6c), é equivalente à anterior, mas em vez de percorrer a lista pelos índices, vai buscar directamente os elementos, pois as listas são objectos iteráveis. A questão 7. pretende determinar quantos e quais os elementos inferiores a um outro elemento dado como referência. Uma vez mais temos uma questão com um ciclo e, no seu interior, um filtro, o if.



def idades_7(lista,ref):
quantos=0
quais = []
for elem in lista:
if elem < ref:
quantos= quantos + 1
quais=quais + [elem]
return quantos,quais


A mesma ideia. Um ciclo e um filtro. Dois acumuladores: um para a contagem, e outro para guardar os elementos que satisfazem a condição. Finalmente, a questão 8.: existe um elemento com 17 anos?


def idades_8a(lista):
return 17 in lista

def idades_8b(lista, idade):
return idade in lista

def idades_8c(lista, idade):
tem_idade = False
for elemento in lista:
if elemento == idade:
tem_idade = True
return tem_idade


A primeira solução é a trivial: usa o que existe. A segunda, é semelhante só que generaliza. Notar que tal se traduziu pela incorporação de mais um parâmetro. A última (8c), responde à necessidade de substituir o teste in. Como nas outras situações, usámos um ciclo, percorremos toda a lista, fazemos um teste que, se for positivo, nos leva a alterar o valor de uma variável que serve de bandaeira (flag).


Como se pode ver todos estes exemplos seguem um padrão semelhante!!

Sem comentários:

Enviar um comentário