장음표시 사용
151쪽
Apronoa Computacao com Python Documentatiori, Versao q.
Como e usual quando se escreVe uma nova classe. nos comeςaremos com os melodos de iniciali Zaςao e St T de modo que poclemos testar o mecanismo basico de se criar e mostrar o novo tipo
Para ligar Os nos, temos que faZer o primetro no da lista referi r ao segundo e o segundo no referi r no terceiro
A referencia do terceiro no e Non Θ, que indica que ele e o linat da lista. Agora o diagrama de esiado se parece com
152쪽
Apronoa Computacao com Python Documentatiori, Versao q.
Agora Voce Sabe como criar nos e liga-los em uma lista. O que pocle estu menos claro neste ponto e por que.
Este diagrama mostra o valor de lista e os Valores que no assume
153쪽
Aprono a Computa octo com Python Documentatiori, Versao q.
49. 4 et T. 4 Listas e Re corren Cia
E natural expressar inuitas operaςoes de listas utili Zando melodos recorrentes. Por exemplo, o seguinte e um algoriimo recorrente para imprimi r urna lista de uas para frente. l. Separe a lista em clois pedaςos: o primetro no chamado a cabeς a): e o resto schamado o rabo). 2. Imprima o rabo de tras para frente. 3. Imprima a C eqn. Logicamente, o Passo 2, a chamada recorrente, assume que nos temos uni modo de imprimi r a lista de uas para frente. Mas se nos assumimos que a chamada recorrente functona - o passo de se - enlao podemos nos convencer de que Oalgori tino functonu Tudo o que preci Samos Sao um caso base e um modo de prOVar que para quatquer lista, nos tremos. ao final; chegar nocaso base. Dada a definiςao recorrente de unia lista. um caso base natural e a lista VaZia. representada por Non Θ
A primetra linita trala o caso base lagendo nuda. As proximas duas linitas dividem a lista em CAUOCA e TAUO. Asduas ultimas linitas imprimem a lista. A virgula no final da ultima linita impede o Python de imprimir uina nova linha
Nao ha nada que impeςa um no de refereticiar de Volta um no anterior na lista, incluindo ele me sino. Por exemplo esta figura mostra uina lista com clois nos, uni dos quais refere-se a si me smo
Capitulo et s. Capitulo qT: Listas oncacleacas
154쪽
Apronoa Computacao com Python Documentatiori, Versao q.
Se nos invocarinos imprimo ista nesta lista, ele ficara em laςo para sempre. Se nos invocarinos imo TimΘDΘTTHS PHTHFTΘnt Q. ele recorrera infinitamente. Este tipo de comportamento torna as listas infinitas disiceis de se lida A despello disto, elas Ocasional mente suo uteis. Por exemplo, podemos representar um numero como uma lista de digitos e usar uina lista infinita para representar uina fraςao repetente. Mesmo nSSim, e problematico que nao possamos prOVar que imp Timp ista e imprimQDOTTA SPATASTQ nTQterminem. o mellior que podernos farer e a afirmaquo hi potetica, 'Se a lista nao contem laςos enlao este melodo terminara V Este tipo de hi potese e chamado urna pre-conclicuo. Ele in Oe uma limitaςao sobre uni dos parametros edescreVe o comportamento do melodo se a limitaristo e satisfeita. Voce Vera mais exemplos em breVe.
Apos a primetra atribuiς CAUOCA e ista tem O mesmo tipo e o mesmo Valor. Entao por que nos criamos unian Va Variavel A raZao e que as duas Variaveis tem dilarentes papeis. Quando pensamos em GHUΘCH. pensamos como uma referenCina um unico no. e quando pensamos em ista o faZemos como uma referencia ao primetro no da lista. Estes 'papeis 'nao Sao parte do programa: eles estaO na mente do programador. Em gerat nao podemos di Zer Oiliando para o programa quat o papel que unia VariaVel tem. Esta ambigui clade pode seruiit, mas iambem pode tornar os programas disiceis de serena lidos. Usamos freqilienternente nomes de variaveis comonoe lista para documentar como pretendemos usar uma VariaVel e algumas VeZes criamos VariaVeis adicionais pararemoVer a ambigui clade. Podeclamos ter escrito imprimo DOTTA SPATAST Ont O sem GHUS CH e THUO. que a tornaria mais concisa mRSpossi Vel mente menos clara
155쪽
Apronoa Computacao com Python Documentatiori, Versao q.
Freqilienternente e utit dividi r urna operaςao de lista em clois melodos. Por exemplo; para imprimis urna lista de uas para frente no formato convencional de lista f3. 2 lJ podemos usar O melodo imp Timp DOTTAS PHTH FTΘnt Θ para
156쪽
Apronoa Computacao com Python Documentatiori, Versao q.
Existem alguns problemas sutis com o modo que implementamos listas. Em uni inverso de causa e elatio. proporemosuma implementaςao alternati Va primetro e enlao explicaremos quai problema ela resolve. Primetro. criaremos unia nova classe chamada Lista Ligasses. Seus atributos Sao um inteiro que contem o comprimento da lista e urna refereticia para o primetro no. Objetos do tipo Lista es acta servem como cabos hiandDS)para se manipular listas de objetos No
157쪽
Apronoa Computacao com Python Documentatiori, Versao q.
Como de costume, Voce deve conferi r codigos como este para Ver se eles tratam os casos especials POr exemplo, oque acontece se a lista esta iniciat mente vagia
Algumas listas sao 'bem formadasV: outras nao o Sao. Por exemplo; se unia lista contem um laqO. ela lara multos denossos melodos falliarem, de modo que poclemos querer requerer que listas nao contentiam laqOS. Outro requerimento e que o Valor de Comprimonio no objeto Lista Lis acta fria igital ao numero reat de nos da lista Requerimentos como estes suo chamados de imuriuntes porque ideat mente; eles deVeriam fer Verclade para cadao et 3 o tempo todo. Especificar invariantes para objetos e iam pratica de programaςao utit porque torna mais facilprouar a correctio do codigo veriticar a integriclade das estriaturas de clados e detectar erros. Uma coisa que algumas VeZes e confusa acerca de invariantes e que existem momentos em que eles suo Violados Por exemplo; no melo de acti Cion APTimoi TO, apos termos adicionado o no mas antes de termos incrementado Comprimonio, o inVariante e Violado. Este tipo de violaςao e acet lavet: de fato. e freqilientemente impossivel modificar iam objeto sem Violar um imari ante por. no minimo. um pequeno instante. Normalmente, requeremos que cada metodo que viola um invariante deVe restaurar este invariante. Se ha quatquer alimento significativo de codigo no quat o invariante e violado e importante tornar isto claro nos comentarios; de modo que nenhuma Operaςao seja fella que dependa daquele invariante.
teorema cla ambigiti classe funclamental ffundamentes ambiguitF theorem) Uma referencia para una no de urna listapode ser tralada como um objeto unico ou como o primetro em uina lista de nos. singleton singletoni Uma lista ligada com somente um nΟ.
Capitulo et s. Capitulo qT: Listas oncacloacas
160쪽
os lipos de clados que Voce Viu ate agora suo todos concretos, no senti do que nos especificamos completamente comoetes suo implementados. Por exemplo, a classe Card Per como Di tria lurido) representa uina carta uti ligandoclois inteiros. Como discuti mos no momento esta nao e a unica manetra de representar Uma carta; existem multas implementaqOes alternuti Vas Um tipo alistrato cle claclo. ou TAU. especifica una conjunto de operaςOes melodos) e a semantica das operaςoes O que elas faZem), mas nao especifica a implementaςao das OperaςGes. Isto e o que o faZ abstrato. Por que isto e utit Simplifica a taresa dcle especificar uni algori imo se voce pode XX denotar denote) as operaςoes que Voce precisa sem ter que pensar ao mesmo tempo, Como us operuς es Sao execuindus. Uma VeZ que existem gerat mente multas manetras de implementar um 4 AD, pode ser utit escreVer um nigritinoque pode ser usado com quatquer das possiseis implementaqOes. Ds bastante conliecidos, como o TAD Pilha deste capitulo ja eslao implementados em bibliotecas padrao.entao eles podem ser escritos unia VeZ e usado por multos programadores. As operaςoes em 'Ds provem urna lingvagem de alto ni Vel comum para especificar e falar sobre algoriimos. Quando falamos sobre 'Ds, gerat mente distingui mos o codigo que usa o TAD, chamado cliente. do codigo que implementa o TAD, chamado codigo forne eclor.