segunda-feira, 31 de outubro de 2011

Problema 5.6

Para resolver o problema de deslizar n posições para a esquerda ou para a direita vamos abordar a questão por etapas. Admitindo que sabemos deslizar isoladamente n elementos para a direita ou para a esquerda a solução gloabla é fácil de escrever.


def desliza_n_d_e(n, lista):
"""Desliza n posições para a direita ou esquerda,de modo circular, os elementos de uma lista."""
if n > 0:
return desliza_d_n(n,lista)
else:
return desliza_e_n(abs(n), lista)

Temos agora que resolver cada um dos dois sub-problemas quer introduzimos. Eles são muito semelhantes. Comecemos pelo deslizar para a direita. A silução consiste em dividir a lista em dois pedaços, em função do valor de n. Guardamos a parte final numa variável auxiliar e depois acrescentamos à sua frente a parte inicial da lista de que partimos. A figura ilustra a estratégia.




O programa tem apenas que ter o cuidado de testar se a lista é vazia ou não.

def desliza_d_n(n, lista):
"""Desliza n posições para a direita,de modo circular, os elementos de uma lista."""
if lista == []:
return lista
else:
aux = lista[-n:]
aux.extend(lista[:len(lista) - n])
return aux



Para o deslizar pata a esquerda usamos o mesmo mecanismo.

def desliza_e_n(n, lista):
"""Desliza n posições para a esquerda,de modo circular, os elementos de uma lista."""
if lista == []:
return lista
else:
aux = lista[n:]
aux.extend(lista[:n])
return aux


Como é lógico podíamos ter resolvido o problema só com uma função, cobrindo os dois casos. Fica para o leitor resolver.

Sem comentários:

Enviar um comentário