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.


>>> def maior(x,y):
... return x > y
>>> maior(5,6)
False
>>> maior(6,5)
True
>>> type(maior)

>>> id(maior)
13432752
>>> maior
<function maior at 0xccf7b0>
>>> menor = maior
>>> menor(6,5)
True
>>>

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


def insertion_both(seq, metodo):
""" Como um jogador de cartas"""
copia=seq[:]
for cont in range(1,len(seq)):
elem=copia[cont]
indice=cont - 1
while (metodo(elem,copia[indice])) and (indice >= 0):
copia[indice + 1] = copia[indice]
indice = indice - 1
copia[indice + 1] = elem
return copia

def maior(x,y):
return (x > y)

def menor(x,y):
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