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.

1.def desliza_n_d_e(n, lista):
2.    """Desliza n posições para a direita ou esquerda,de modo circular, os elementos de uma lista."""
3.    if n > 0:
4. return desliza_d_n(n,lista)
5.    else:
6.        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.
1.def desliza_d_n(n, lista):
2.    """Desliza n posições para a direita,de modo circular, os elementos de uma lista."""
3.    if lista == []:
4.        return lista
5.    else:
6.        aux = lista[-n:]
7.        aux.extend(lista[:len(lista) - n])
8.        return aux



Para o deslizar pata a esquerda usamos o mesmo mecanismo.
1.def desliza_e_n(n, lista):
2.    """Desliza n posições para a esquerda,de modo circular, os elementos de uma lista."""
3.    if lista == []:
4.        return lista
5.    else:
6.        aux = lista[n:]
7.        aux.extend(lista[:n])
8.        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