domingo, 20 de dezembro de 2009

Problema 10.2

A dificuldade desta questão residia apenas na compreensão de que é possível passar uma função como argumento. Em Python, tudo são objectos e, por isso, as funções também são objectos, caracterizadas por identidade, valor e tipo. Por outro lado, o que se comunica a uma definição aquando da sua chamada ou é um objecto ou uma referência para um objecto. Na listagem abaixo ilustramos alguns destes aspectos.

01.>>> def maior(x,y):
02.... return  x > y
03.>>> maior(5,6)
04.False
05.>>> maior(6,5)
06.True
07.>>> type(maior)
08.<type 'function'="">
09.>>> id(maior)
10.13432752
11.>>> maior
12.<function maior at 0xccf7b0>
13.>>> menor = maior
14.>>> menor(6,5)
15.True
16.>>>
17.</type>

Regressando ao nosso problema. O desafio é evitar duplicar o código, transmitindo na chamada a referência para a operação de comparação.

01.def insertion_both(seq, metodo):
02. """ Como um jogador de cartas"""
03. copia=seq[:]
04. for cont in range(1,len(seq)):
05.  elem=copia[cont]
06.  indice=cont - 1
07.  while (metodo(elem,copia[indice])) and (indice >= 0):
08.   copia[indice + 1] = copia[indice]
09.   indice = indice - 1
10.  copia[indice + 1] = elem
11. return copia
12. 
13.def maior(x,y):
14. return (x > y)
15. 
16.def menor(x,y):
17. return (x < y)

E assim se resolve de forma simples e elegante, um problema aparentemente difícil! Deixo ao leitor o cuidado de perceber porque é que foi preciso criar as funções maior e menor que apenas fazem o que > e < fazem!

Sem comentários:

Enviar um comentário