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 é:

1.def idades_5c(lista):
2.   return max(lista), min(lista)


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

01.def idades_5d(lista):
02.   menor = lista[0]
03.   maior = lista[0]
04. 
05.  for indice in range(1,len(lista)):
06.    if lista[indice] < menor :
07.         menor = lista[indice]
08.         if lista[i] > maior:
09.            maior = lista[indice]
10.   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.

01.def idades_6a(lista):
02.return sum(lista)
03. 
04.def idades_6b(lista):
05.   soma=0
06.   for indice in range(len(lista)):
07.     soma=soma+ [lista[indice]]
08.  return soma
09. 
10.def idades_6c(lista):
11.  soma=0
12.  for elem in lista:
13.     soma=soma+elem
14. 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.


1.def idades_7(lista,ref):
2.      quantos=0
3.      quais  = []
4.      for elem in lista:
5.           if elem < ref:
6.                quantos= quantos + 1
7.                quais=quais + [elem]
8.      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?

01.def idades_8a(lista):
02.    return 17 in lista
03. 
04.def idades_8b(lista, idade):
05.     return idade in lista
06. 
07.def idades_8c(lista, idade):
08.   tem_idade = False
09.   for elemento in lista:
10.   if elemento == idade:
11.      tem_idade = True
12.  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