Pergunta 1
O conceito de aliasing foi várias vezes referido nas aulas. Na sua essências significa a atribuição de dois ou mais nomes a um mesmo objecto. Um exemplo simples
>>> a = [1,2,3]
>>> b = a
>>> b
[1, 2, 3]
>>> id(a)
4412212648
>>> id(b)
4412212648
>>>
a e b são nomes para o mesmo objecto. Um problema colocado por este mecanismo é a possibilidade, quando os objectos são mutáveis, ao alterarmos um objecto através de um dos seus nomes, todos os outros acompanham a mudança.
>>> a[1] = 4
>>> a
[1, 4, 3]
>>> b
[1, 4, 3]
>>>
Pergunta 2
Eis o programa errado.
def retira_dup(x):
for i in range(len(x)):
if x[i] in x[i+1:]:
x[i+1:].remove(x[i])
return x
Comecemos pelo tipo de objecto. Tem que ser uma sequência, devido à operação de fatiamento. De entre as sequências possíveis (lista de caracteres, tuplos, listas) terá que ser um lista pois trata-se do método remove.
Agora os erros. A ideia do programa é a verificar se o elemento na posiçãoi existe na parte da lista a partir de i+1. Se existe, então estamos perante uma repetição, pelo que precisamos retirar todas as suas ocorrências. Mas o método remove só tira uma. Logo aqui temos um problema. Por outro lado, ao retirar elementos estamos a alterar a lista que fica mais pequena e pode acontecer que por isso isso tome valores fora da lista e isso vai gerar um erro. Uma forma de concertar as coisas é dada no programa abaixo.
def retira_dup_good(x):
res = []
for i in range(len(x)):
if x[i] not in x[i+1:]:
res.append(x[i])
return res
Usamos a ideia ciclo-contador-acumulador.
Problema 3
A questão colocada pode ser resolvida procurando saber se é possível fazer a ligação entre todos os vértices do grafo que aparecem no caminho. Mal falhe um caso, devolve-se falso.
def percurso(grafo, caminho):
for ind in range(len(caminho)-1):
if caminho[ind+1] not in grafo.get(caminho[ind]):
return False
return True
Como se pode ver o problema resolve-se com as operações e métodos mais comuns dos dicionários. Caso não tenha conseguido resolver na aula, estude bem esta solução.
Sem comentários:
Enviar um comentário