USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

Tamanho: px
Começar a partir da página:

Download "USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio"

Transcrição

1 USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS Bruno Maffeo Departamento de Informática PUC-Rio

2 MÉTODO INDUTIVO O método indutivo para resolver problemas aqui empregado inspira-se na formulação mais simples de uma prova de teoremas por indução. A estrutura do método é análoga à utilizada nesse tipo de prova e compreende duas seções, a saber: a seção denominada caso base, relativa a versões do problema que dispõem de solução imediata. Um caso base refere-se a uma versão específica do problema proposto, para a qual se propõe uma solução imediata. Exemplos: quando o problema proposto for calcular o fatorial de um natural n, o caso base a ser empregado corresponde à versão do problema em que n é igual a zero; a solução para esse problema, conforme a própria definição de fatorial é 1 quando o problema proposto for calcular a soma dos itens de uma seqüência de números reais, um caso base possível a ser empregado corresponde à versão do problema em que a seqüência é vazia; a solução para esse problema é 0, pois este é o elemento neutro da operação de soma quando o problema proposto for calcular número de itens de um conjunto, o caso base a ser empregado corresponde à versão do problema em que o conjunto é vazio; a solução para esse problema, obviamente, é 0; a seção denominada passo indutivo, que apresenta uma solução para o problema proposto utilizando a solução, supostamente disponível, para uma versão de menor porte do problema. Pode-se imaginar o passo indutivo como sendo um degrau, situado abaixo do nível do problema proposto originalmente, em direção a um caso base. Talvez a maior dificuldade na utilização desse método para resolver problemas esteja em ter confiança na solidez desse degrau. O passo indutivo deve ser estabelecido confiando-se totalmente na validade de adotarse a hipótese indutiva, que corresponde a supor resolvida a versão de menor porte do problema proposto. Esse procedimento é análogo ao usado em outras situações, em Matemática e em Física, onde só se avança na direção da solução quando é possível apoiar-se em uma hipótese bem formulada e válida. Na presente situação, a validade da hipótese indutiva é um pressuposto do próprio método de solução e, por isso, dispensa qualquer outra forma de comprovação. Os exemplos a seguir ilustram o passo indutivo referente à solução de problemas cujo caso base foi abordado precedentemente: quando o problema proposto for calcular o fatorial de um natural n, o passo indutivo utilizará a hipótese indutiva fat (n-1) que, supostamente, resolve o problema de menor porte que é calcular o fatorial de n-1 ; assumindo-se como válida essa hipótese, constróise o passo indutivo por meio da expressão n x fat (n-1) a qual, conforme a própria definição de fatorial, garantidamente resolve o problema proposto originalmente Método Indutivo para Resolver Problemas B. Maffeo página 2 de 38

3 quando o problema proposto for calcular a soma dos itens de uma seqüência de números reais, o passo indutivo utilizará a hipótese indutiva soma-seq ( cauda (seq) ) que, supostamente, resolve o seguinte problema de menor porte: calcular a soma dos itens da cauda da seqüência (onde, por definição, a função cauda (seq) retorna a seqüência obtida ao suprimir-se o primeiro item da seqüência seq); assumindo-se como válida essa hipótese, constrói-se o passo indutivo por meio da expressão cabeça (seq) + somaseq ( cauda (seq) )) (onde, por definição, a função cabeça (seq) retorna o primeiro item da seqüência seq). Essa expressão, garantidamente, resolve o problema proposto originalmente. Nessas condições, a solução do problema proposto deverá ser apresentada da seguinte forma: Seção correspondente ao(s) caso(s) base Aqui, resolve-se o problema em um ou mais casos simples, de ordem zero, que possam ser alcançado reduzindo-se sucessivamente a ordem do problema proposto, considerado de ordem n. Cada caso simples é denominado caso base e caracteriza-se por possuir uma solução imediata, direta. Seção correspondente ao(s) passo(s) indutivo(s) Aqui, a solução do problema proposto, de ordem n, é formulada admitindo-se que se conhece a solução para uma versão de menor porte, de ordem n-1. Ou seja, o raciocínio a ser empregado para a solução do problema proposto deve abranger: a hipótese indutiva: supõe-se resolvido o problema de ordem n-1 uma proposta de solução para o problema de ordem n com base na solução do problema menor. Resumindo, a solução de um problema com base nesse método deve possuir a seguinte estrutura: Seção de declaração de caso(s) base: em um caso base, o porte do problema não precisa ser reduzido e sua solução, imediata, é conhecida. Deve-se poder alcançar um caso base por meio da redução sistemática do porte do problema proposto originalmente Seção de declaração de passo(s) indutivo(s): em um passo indutivo, a solução de um problema de menor porte é suposta conhecida hipótese indutiva e deve ser usada isoladamente ou em uma expressão que permita gerar a solução do problema proposto. Agora, é necessário demonstrar que o método indutivo descrito precedentemente fundamenta, de fato, um processo para gerar soluções de problemas. Método Indutivo para Resolver Problemas B. Maffeo página 3 de 38

4 Sejam: O PROCESSO INDUTIVO P n o problema proposto, dito de ordem n, e S (P n ) a solução desejada P 0 uma versão simples problema proposto, dita de ordem 0, e S (P o ) a solução imediata correspondente exp ( S (P n-1 ) ) a expressão associada ao passo indutivo, envolvendo a solução S (P n-1 ) supostamente conhecida para o problema de ordem n-1, que garantidamente proporciona a solução do problema de ordem n, obedecendo à formulação S (P n ) = exp ( S (P n-1 ) ). Assim sendo, se a hipótese indutiva for verdadeira, ou seja, se S (P n-1 ) for conhecida, o problema proposto está resolvido. E se a hipótese indutiva não for verdadeira? Nesse caso, como P n e P n-1 são dois problemas de mesma natureza diferindo apenas no porte, pode-se usar novamente o passo indutivo do método e escrever: S (P n-1 ) = exp ( S (P n-2 ) ). Se, agora, a hipótese indutiva for verdadeira, obtém-se a solução S (P n-1 ) a qual, em seguida, poderá ser usada em S (P n ) = exp ( S (P n-1 ) ) para gerar a solução do problema proposto. Se a hipótese indutiva ainda não for verdadeira, procede-se sucessivamente a redução do porte do problema até que o caso base, expresso pela versão P 0 do problema, seja atingido. Nessa situação, obtém-se: S (P 1 ) = exp ( S (P 0 ) ). Agora, por definição de caso base, S (P 0 ) é conhecida. Então, pode-se calcular, sucessivamente, S (P 1 ), S (P 2 ),, S (P n-2 ), S (P n-1 ) e, finalmente, S (P n ), que é a solução do problema proposto. Resumindo o processo de solução baseado no método indutivo apresentado, verifica-se que ese processo requer: a definição de pelo menos um caso base a especificação de pelo menos um passo indutivo, no qual formula-se a expressão envolvendo a solução, supostamente conhecida, de uma versão de menor porte do problema proposto; essa expressão deverá, garantidamente, resolver o problema proposto a possibilidade de atingir-se o caso base por meio da redução sucessiva do problema proposto. Com o objetivo de sintetizar os aspectos básicos do processo acima descrito, são apresentadas a seguir duas visões esquemáticas das relações principais nele envolvidas. Método Indutivo para Resolver Problemas B. Maffeo página 4 de 38

5 VISÕES ESQUEMÁTICAS DO PROCESSO INDUTIVO o encadeamento das diferentes versões do mesmo problema P 0 P 1... P n-1 P n Nesta primeira visão, procura-se evidenciar a relação entre as diferentes versões do problema proposto. Ou seja, o esquema indica que a versão de ordem n, para ser resolvida, necessita ser reduzida em porte até atingir o caso base, versão de ordem 0. Essa indicação é sugerida pelo uso de setas em linha pontilhada. Indica-se também que, a partir do caso base, deve m ser geradas as soluções sucessivas das versões de ordem superior até atingir a versão proposta originalmente. Essa indicação é sugerida pelo uso de setas em linha cheia. o encadeamento das soluções associadas às diferentes versões do problema S (P n ) = exp ( S (P n-i ) ) S (P n-1 ) = exp ( S (P n-2 ) ) S (P 1 ) = exp ( S (P 0 ) ) Nesta segunda visão, procura-se evidenciar a relação entre as soluções das diferentes versões do problema proposto. Ou seja, esquema indica que a solução da versão de ordem n requer a solução da versão de ordem n-1; por sua vez, a solução da versão de ordem n-1 requer a solução da versão de ordem n-2; e assim sucessivamente, até ser atingido o caso base, versão de ordem 0, para o qual dispõe-se de uma solução imediata. Essa indicação é sugerida pelo uso de setas em linha pontilhada. Indica-se também que, a partir da solução do caso base, são geradas as soluções sucessivas das versões de ordem superior até atingir a versão proposta originalmente. Essa indicação é sugerida pelo uso de setas em linha cheia. Método Indutivo para Resolver Problemas B. Maffeo página 5 de 38

6 FUNÇÃO FATORIAL Definição da função fat (n), onde n fat (n) = n x (n-1) x (n-2) x x 2 x 1 extensão de domínio: fat (0) = 1. Problema: calcular o fatorial de n. CASO BASE n = 0, cuja solução é 1, ou seja, fat (0) = 1 PASSO INDUTIVO n x fat (n-1) VERIFICAÇÃO para n = 3 fat (3) passo indutivo 3 x fat (2) passo indutivo 3 x 2 x fat (1) passo indutivo 3 x 2 x 1 x fat (0) caso base 3 x 2 x 1 x 1 operações pendentes 6 (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 6 de 38

7 PROCESSAMENTO DE SEQÜÊNCIAS Definição de SEQÜÊNCIA SOMA DOS NÚMEROS DE UMA SEQÜÊNCIA estrutura matemática linear de itens que mantêm um posicionamento relativo bem definido extensão de domínio: a inexistência de itens é também considerada uma seqüência, denominada seqüência vazia e representada pelo símbolo seq-vazia. Consideremos predefinidas as funções cabeça, cauda e insere-seq, tais que: cabeça (seq) retorna o item, denominado cabeça, situado na primeira posição da seqüência seq cauda (seq) retorna a seqüência, denominada cauda, constituída pela seqüência seq da qual é retirado o cabeça insere-seq (item, seq) retorna a seqüência constituída pelo valor de seq no qual estará inserido o valor de item na primeira posição. Problema: definir a função soma-seqüência (seq). CASO BASE seq = seq-vazia, cuja solução é 0; ou seja, soma-seqüência (seq-vazia) = 0 PASSO INDUTIVO cabeça (seq) + soma-seqüência (cauda (seq)) VERIFICAÇÃO para a seqüência (1, 2, 3) soma-seqüência ( (1, 2, 3) ) passo indutivo 1 + soma-seqüência ( (2, 3) ) passo indutivo soma-seqüência ( (3) ) passo indutivo soma-seqüência ( seq-vazia ) caso base operações pendentes 6 (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 7 de 38

8 PROCESSAMENTO DE SEQÜÊNCIAS SOMAR 1 AOS NÚMEROS DE UMA SEQÜÊNCIA Problema: definir a função soma-um (seq) que constrói uma seqüência contendo, na mesma ordem, os números de uma seqüência seq incrementados de 1. CASO BASE seq = seq-vazia, cuja solução é seq-vazia; ou seja, soma-um (seq-vazia) = seq-vazia PASSO INDUTIVO insere-seq ( ( cabeça (seq) + 1 ), soma-um (cauda (seq)) ) VERIFICAÇÃO para a seqüência (1, 2, 3) soma-um ( (1, 2, 3) ) passo indutivo insere-seq ( ( ), soma-um ( (2, 3) ) ) soma + passo indutivo insere-seq ( 2, insere-seq ( ( ), soma-um ( (3) ) ) ) soma + passo indutivo insere-seq ( 2, insere-seq ( 3, insere-seq ( ( ), soma-um ( seq-vazia ) ) ) ) soma + caso base insere-seq ( 2, insere-seq ( 3, insere-seq ( 4, seq-vazia ) ) ) operação pendente insere-seq ( 2, insere-seq ( 3, (4) ) ) operação pendente insere-seq ( 2, (3, 4) ) ) operação pendente (2, 3, 4) (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 8 de 38

9 PROCESSAMENTO DE SEQÜÊNCIAS VERIFICAR SE UM ITEM ESTÁ CONTIDO EM UMA SEQÜÊNCIA Problema: definir a função pertence-seq? (item, seq) que verifica se o valor de item está contido na seqüência seq. CASOS BASE 1) seq = seq-vazia, cuja solução é false; ou seja, pertence-seq? (item, seq-vazia) = false 2) cabeça (seq) = item, cuja solução é true; ou seja, neste caso, pertence-seq? (item, seq) = true PASSO INDUTIVO pertence-seq? (item, cauda(seq)) VERIFICAÇÃO para item = 3 e seq = (1, 2, 3) pertence-seq? ( 3, (1, 2, 3) ) passo indutivo pertence-seq? ( 3, (2, 3) ) passo indutivo pertence-seq? ( 3, (3) ) caso base 2 true (resultado) VERIFICAÇÃO para item = 3 e seq = (1, 2) pertence-seq? ( 3, (1, 2) ) passo indutivo pertence-seq? ( 3, (2) ) passo indutivo pertence-seq? ( 3, seq-vazia ) caso base 1 false (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 9 de 38

10 PROCESSAMENTO DE CONJUNTOS VERIFICAR SE UM CONJUNTO É SUBCONJUNTO IMPRÓPRIO DE OUTRO ( todo elemento de um está contido no outro ) Problema: definir a função subconjunto? (conj1, conj2) que verifica se todo elemento de conj1 pertence a conj2. Consideremos predefinidas as funções prim-el e restante, tais que: prim-el (conj) retorna o primeiro elemento de conjunto conj restante (conj) retorna o conjunto constituído pelos elementos de conj da qual é retirado o primeiro insere-conj (elem, conj) retorna o conjunto constituído pelos elementos de conj no qual estará inserido o valor de elem na primeira posição. CASOS BASE 1) conj1 = conj-vazio, cuja solução é true ou seja, subconjunto? (conj-vazio, conj2) = true 2) conj2 = conj-vazio, cuja solução é false ou seja, subconjunto? (conj1, conj-vazio) = false 3) prim-el (conj1) conj2, cuja solução é false ou seja, neste caso, subconjunto? (conj1, conj2) = false PASSO INDUTIVO subconjunto? (restante (conj1), conj2) VERIFICAÇÃO para conj1 = { 1, 2 } e conj2 = { 1, 2, 3 } subconjunto? ( { 1, 2 }, { 1, 2, 3 } ) passo indutivo subconjunto? ( { 2 }, { 1, 2, 3 } ) passo indutivo subconjunto? ( conj-vazio, { 1, 2, 3 } ) caso base 1 true (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 10 de 38

11 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A UNIÃO DE DOIS CONJUNTOS ( elementos pertencentes a um ou a outro conjunto ) Problema: definir a função união (conj1, conj2) que constrói um conjunto onde cada elemento pertence a conj1 ou a conj2. CASOS BASE 1) conj1 = conj-vazio, cuja solução é conj2 ou seja, união (conj-vazio, conj2) = conj2 2) conj2 = conj-vazio, cuja solução é conj1 ou seja, união (conj1, conj-vazio) = conj1 PASSOS INDUTIVOS 1) se prim-el (conj1) conj2 então união (restante (conj1), conj2) 2) se prim-el (conj1) conj2 então insere-conj ( prim-el (conj1), união (restante (conj1), conj2) ) VERIFICAÇÃO para conj1 = { 1, 4 } e conj2 = { 1, 2, 3 } união ( { 1, 4 }, { 1, 2, 3 } ) passo indutivo 1 união ( { 4 }, { 1, 2, 3 } ) passo indutivo 2 insere-conj ( 4, união ( conj-vazio, { 1, 2, 3 } ) ) caso base 1 insere-conj ( 4, { 1, 2, 3 } ) insere 4 (operação pendente) {4, 1, 2, 3} (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 11 de 38

12 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A INTERSEÇÃO DE DOIS CONJUNTOS ( elementos pertencentes a um e a outro conjunto ) Problema: definir a função interseção (conj1, conj2) que constrói um conjunto onde cada elemento pertence a conj1 e a conj2. CASOS BASE 1) conj1 = conj-vazio, cuja solução é conj-vazio ou seja, interseção (conj-vazio, conj2) = conj-vazio 2) conj2 = conj-vazio, cuja solução é conj-vazio ou seja, interseção (conj1, conj-vazio) = conj-vazio PASSOS INDUTIVOS 1) se prim-el (conj1) conj2 então insere-conj ( prim-el (conj1), interseção (restante (conj1), conj2) ) 2) se prim-el (conj1) conj2 então interseção (restante (conj1), conj2) VERIFICAÇÃO para conj1 = { 1, 2 } e conj2 = { 1, 2, 3 } interseção ( { 1, 2 }, { 1, 2, 3 } ) passo indutivo 1 insere-conj ( 1, interseção ( { 2 }, { 1, 2, 3 } ) ) passo indutivo 1 insere-conj ( 1, (insere-conj ( 2, interseção ( conj-vazio, { 1, 2, 3 } ) ) ) ) caso base 1 insere-conj ( 1, (insere-conj ( 2, conj-vazio ) ) ) insere 2 (operação pendente) insere-conj ( 1, {2} ) insere 1 { 1, 2 } (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 12 de 38

13 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A DIFERENÇA DE DOIS CONJUNTOS ( elementos de um conjunto que não pertencem ao outro conjunto ) Problema: definir a função diferença (conj1, conj2) que constrói um conjunto contendo os elementos de conj1 que não pertencem a conj2. CASOS BASE 1) conj1 = conj-vazio, cuja solução é conj-vazio ou seja, diferença (conj-vazio, conj2) = conj-vazio 2) conj2 = conj-vazio, cuja solução é conj1 ou seja, diferença (conj1, conj-vazio) = conj1 PASSOS INDUTIVOS 1) se prim-el (conj1) conj2 então diferença (restante (conj1), conj2) 2) se prim-el (conj1) conj2 então insere-conj ( prim-el (conj1), diferença (restante (conj1), conj2) ) VERIFICAÇÃO para conj1 = { 1, 2 } e conj2 = { 1, 2, 3 } diferença ( { 1, 2 }, { 1, 2, 3 } ) passo indutivo 1 diferença ( { 2 }, { 1, 2, 3 } ) passo indutivo 1 diferença ( conj-vazio, { 1, 2, 3 } ) caso base 1 conj-vazio (resultado) Método Indutivo para Resolver Problemas B. Maffeo página 13 de 38

14 PROCESSAMENTO DE ÁRVORES BINÁRIAS CALCULAR QUANTOS NODOS NÃO POSSUEM FILHO À ESQUERDA Problema: utilizando versões matemáticas para as operações básicas do TAD Árvore Binária, definir a função conta-nodos-sfe (ab) que calcula quantos nodos de ab não possuem filho à esquerda. CASOS BASE 1) ab = arv-bin-vazia, cuja solução é 0 ou seja, conta-nodos-sfe (ab) = 0 2) folha? (ab) = true, cuja solução é 1 ou seja, conta-nodos-sfe (ab) = 1 PASSOS INDUTIVOS 1) se ( arv-bin-vazia? (esquerda (ab)) and (not folha? (ab)) ) = true então 1 + conta-nodos-sfe (direita (ab)) 2) se ( arv-bin-vazia? (direita (ab)) and (not folha? (ab)) ) = true então conta-nodos-sfe (esquerda (ab)) 3) se (not ( arv-bin-vazia? (esquerda (ab)) or arv-bin-vazia? (direita (ab)) ) ) = true então conta-nodos-sfe (esquerda (ab)) + conta-nodos-sfe (esquerda (ab)) Método Indutivo para Resolver Problemas B. Maffeo página 14 de 38

15 USANDO RECURSÃO PARA RESOLVER PROBLEMAS Desejando-se resolver o problema proposto por meio de um programa de computador, pode ser buscada uma solução computacional que se fundamente na solução ( abstrata, ou conceitual, na medida em que não indica qualquer forma específica para ser implementada) obtida com base no método indutivo apresentado precedentemente. Nesse caso, o programa deverá refletir o problema de ordem zero ( caso base, no qual a solução é conhecida ) e o passo indutivo ( usar a solução do problema de ordem n-1 para, garantidamente, obter a solução do problema de ordem n ). Assim sendo, esse programa deve permitir que: a ordem do problema proposto quando este não constituir um caso base seja reduzida sucessivamente até que um caso base seja atingido durante esse processo de redução, seja mantida pendente cada instância da operação, se houver alguma, especificada no passo indutivo. Nessas condições, a implementação desejada deverá empregar uma linguagem de programação que permita a construção de estruturas de código que possam chamar-se a si mesmas e, a cada chamada, reduzir sistematicamente o porte do problema proposto inicialmente. E, também, que, ao final de cada passo do processamento, seja mantida pendente cada instância da operação, se houver alguma, especificada no passo indutivo da solução conceitual. Uma solução implementada com essas características denomina-se solução recursiva. Muitas vezes, é conveniente especificar essa alternativa de implementação em dois passos: 1. correspondente ao nível de design, onde ainda não se utilizam as características de uma linguagem de programação específica 2. correspondente ao nível de implementação, onde se constrói o programa desejado em termos da linguagem de programação escolhida. Em problemas de complexidade reduzida, é possível omitir-se o passo correspondente ao nível de design e passar diretamente do nível conceitual para a implementação. A seguir será considerado o caso de soluções baseadas em funções recursivas e serão apresentados um roteiro para o design e dois templates para a implementação ( em Scheme ) desse tipo de função. Método Indutivo para Resolver Problemas B. Maffeo página 15 de 38

16 FUNÇÃO RECURSIVA ROTEIRO PARA O DESIGN IDENTIFICAR no caso de qualquer função 1. domínio 2. contra-domínio (imagem) 3. precondição no caso de função recursiva 4. caso(s) base 5. valor da função no(s) caso(s) base 6. teste de término no(s) caso(s) base 7. chamada(s) recursiva(s) 8. o que deve ser feito para, usando o(s) valor(es) produzido(s) pela(s) chamada(s) recursiva(s), gerar o valor a ser retornado pela função. CASO BASE Considera-se como caso base, não "o mais simples", mas qualquer caso em que a recursão termine. Ou seja, é um caso que não exige chamada recursiva para ser resolvido. VALOR PRODUZIDO PELA CHAMADA RECURSIVA Por hipótese, é o resultado que se espera obter pelo uso da função para resolver o problema de ordem n-1. Método Indutivo para Resolver Problemas B. Maffeo página 16 de 38

17 FUNÇÃO FATORIAL Problema: calcular o fatorial de n. SOLUÇÃO CONCEITUAL CASO BASE n = 0, cuja solução é 1, ou seja, fat (0) = 1 PASSO INDUTIVO n x fat (n-1) DESIGN 1. domínio: 2. contra-domínio: 3. precondição: argumento ( n ) deve pertencer a 4. caso base: n=0 5. valor da função no caso base: 1 6. teste de término no caso base: n=0? 7. chamada recursiva: sobre n-1 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: multiplicar por n o valor (um número) produzido pela chamada recursiva. Método Indutivo para Resolver Problemas B. Maffeo página 17 de 38

18 PROCESSAMENTO DE SEQÜÊNCIAS SOMA DOS NÚMEROS DE UMA SEQÜÊNCIA Problema: definir a função soma-seqüência (seq). SOLUÇÃO CONCEITUAL CASO BASE seq = seq-vazia, cuja solução é 0; ou seja, soma-seqüência (seq-vazia) = 0 PASSO INDUTIVO cabeça (seq) + soma-seqüência (cauda (seq)) DESIGN ( empregando lista como modelo de dados ) 1. domínio: C-listas 2. contra-domínio: R 3. precondição: argumento ( lista ) deve pertencer a C-listas e seus itens devem ser números reais 4. caso base: argumento é lista-vazia 5. valor da função no caso base: 0 6. teste de término no caso base: argumento é lista-vazia? 7. chamada recursiva: sobre a cauda do argumento 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: somar, ao valor (um número) produzido pela chamada recursiva, o cabeça do argumento. Método Indutivo para Resolver Problemas B. Maffeo página 18 de 38

19 PROCESSAMENTO DE SEQÜÊNCIAS SOMAR 1 AOS NÚMEROS DE UMA SEQÜÊNCIA Problema: definir a função soma-um (seq) que constrói uma seqüência contendo, na mesma ordem, os números de uma seqüência seq incrementados de 1. SOLUÇÃO CONCEITUAL CASO BASE seq = seq-vazia, cuja solução é seq-vazia; ou seja, soma-um (seq-vazia) = seq-vazia PASSO INDUTIVO insere-seq ( ( cabeça (seq) + 1 ), soma-um (cauda (seq)) ) DESIGN ( empregando lista como modelo de dados ) 1. domínio: C-listas 2. contra-domínio: C-listas 3. precondição: argumento ( lista ) deve pertencer a C-listas e seus itens devem ser números reais 4. caso base: argumento é lista-vazia 5. valor da função no caso base: lista-vazia 6. teste de término no caso base: argumento é lista-vazia? 7. chamada recursiva: sobre a cauda do argumento 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o valor do cabeça do argumento incrementado de uma unidade. Método Indutivo para Resolver Problemas B. Maffeo página 19 de 38

20 PROCESSAMENTO DE SEQÜÊNCIAS VERIFICAR SE UM ITEM ESTÁ CONTIDO EM UMA SEQÜÊNCIA Problema: definir a função pertence-seq? (item, seq) que verifica se o valor de item está contido na seqüência seq. SOLUÇÃO CONCEITUAL CASOS BASE 1) seq = seq-vazia, cuja solução é false; ou seja, pertence-seq? (item, seq-vazia) = false 2) cabeça (seq) = item, cuja solução é true; ou seja, neste caso, pertence-seq? (item, seq) = true PASSO INDUTIVO pertence-seq? (item, cauda(seq)) DESIGN ( empregando lista como modelo de dados ) 1. domínio: C-itens x C-listas 2. contra-domínio: { true, false } 3. precondição: primeiro argumento ( item ) deve pertencer a C-itens e segundo argumento ( lista ) deve pertencer a C-listas 4. casos base: a) lista é lista-vazia b) cabeça de lista é igual a item 5. valor da função nos casos base: a) false b) true 6. teste de término no caso base: a) lista é lista-vazia? b) ( (cabeça de lista) = item )? 7. chamada recursiva: sobre item e a cauda de lista 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada. Método Indutivo para Resolver Problemas B. Maffeo página 20 de 38

21 PROCESSAMENTO DE CONJUNTOS VERIFICAR SE UM CONJUNTO É SUBCONJUNTO IMPRÓPRIO DE OUTRO ( todo elemento de um está contido no outro ) Problema: definir a função subconjunto? (conj1, conj2) que verifica se todo elemento de conj1 pertence a conj2. SOLUÇÃO CONCEITUAL CASOS BASE 1) conj1 = conj-vazio, cuja solução é true ou seja, subconjunto? (conj-vazio, conj2) = true 2) conj2 = conj-vazio, cuja solução é false ou seja, subconjunto? (conj1, conj-vazio) = false 3) prim-el (conj1) conj2, cuja solução é false ou seja, neste caso, subconjunto? (conj1, conj2) = false PASSO INDUTIVO subconjunto? (restante (conj1), conj2) DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: { true, false } 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia c) cabeça de conj1 não está contido em conj2 5. valor da função nos casos base: a) true b) false c) false 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? c) not ( (cabeça de conj1) pertence a conj2 )? 7. chamada recursiva: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada. Método Indutivo para Resolver Problemas B. Maffeo página 21 de 38

22 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A UNIÃO DE DOIS CONJUNTOS ( elementos pertencentes a um ou a outro conjunto ) Problema: definir a função união (conj1, conj2) que constrói um conjunto onde cada elemento pertence a conj1 ou a conj2. SOLUÇÃO CONCEITUAL CASOS BASE 1) conj1 = conj-vazio, cuja solução é conj2 ou seja, união (conj-vazio, conj2) = conj2 2) conj2 = conj-vazio, cuja solução é conj1 ou seja, união (conj1, conj-vazio) = conj1 PASSOS INDUTIVOS 1) se prim-el (conj1) conj2 então união (restante (conj1), conj2) 2) se prim-el (conj1) conj2 então insere-conj ( prim-el (conj1), união (restante (conj1), conj2) ) DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: C-listas 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia 5. valor da função nos casos base: a) conj2 b) conj1 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? 7. chamadas recursivas: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada, se o cabeça de conj1 pertencer a conj2; no caso contrário, acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o cabeça de conj1. Método Indutivo para Resolver Problemas B. Maffeo página 22 de 38

23 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A INTERSEÇÃO DE DOIS CONJUNTOS ( elementos pertencentes a um e a outro conjunto ) Problema: definir a função interseção (conj1, conj2) que constrói um conjunto onde cada elemento pertence a conj1 e a conj2. SOLUÇÃO CONCEITUAL CASOS BASE 1) conj1 = conj-vazio, cuja solução é conj-vazio ou seja, interseção (conj-vazio, conj2) = conj-vazio 2) conj2 = conj-vazio, cuja solução é conj-vazio ou seja, interseção (conj1, conj-vazio) = conj-vazio PASSOS INDUTIVOS 1) se prim-el (conj1) conj2 então insere-conj ( prim-el (conj1), interseção (restante (conj1), conj2) ) 2) se prim-el (conj1) conj2 então interseção (restante (conj1), conj2) DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: C-listas 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia 5. valor da função nos casos base: a) lista-vazia b) lista-vazia 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? 7. chamadas recursivas: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada, se o cabeça de conj1 não pertencer a conj2; no caso contrário, acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o cabeça de conj1. Método Indutivo para Resolver Problemas B. Maffeo página 23 de 38

24 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A DIFERENÇA DE DOIS CONJUNTOS ( elementos de um conjunto que não pertencem ao outro conjunto ) Problema: definir a função diferença (conj1, conj2) que constrói um conjunto contendo os elementos de conj1 que não pertencem a conj2. SOLUÇÃO CONCEITUAL CASOS BASE 1) conj1 = conj-vazio, cuja solução é conj-vazio ou seja, diferença (conj-vazio, conj2) = conj-vazio 2) conj2 = conj-vazio, cuja solução é conj1 ou seja, diferença (conj1, conj-vazio) = conj1 PASSOS INDUTIVOS 1) se prim-el (conj1) conj2 então diferença (restante (conj1), conj2) 2) se prim-el (conj1) conj2 então insere-conj ( prim-el (conj1), diferença (restante (conj1), conj2) ) DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: C-listas 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia 5. valor da função nos casos base: a) lista-vazia b) valor de conj1 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? 7. chamadas recursivas: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada, se o cabeça de conj1 pertencer a conj2; no caso contrário, acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o cabeça de conj1. Método Indutivo para Resolver Problemas B. Maffeo página 24 de 38

25 PROCESSAMENTO DE ÁRVORES BINÁRIAS CALCULAR QUANTOS NODOS NÃO POSSUEM FILHO À ESQUERDA Problema: definir a função conta-nodos-sfe (ab) que calcula quantos nodos de ab não possuem filho à esquerda. SOLUÇÃO CONCEITUAL CASOS BASE 1) ab = arv-bin-vazia, cuja solução é 0 ou seja, conta-nodos-sfe (ab) = 0 2) folha? (ab) = true, cuja solução é 1 ou seja, conta-nodos-sfe (ab) = 1 PASSOS INDUTIVOS 1) se ( arv-bin-vazia? (esquerda (ab)) and (not folha? (ab)) ) = true então 1 + conta-nodos-sfe (direita (ab)) 2) se ( arv-bin-vazia? (direita (ab)) and (not folha? (ab)) ) = true então conta-nodos-sfe (esquerda (ab)) 3) se (not ( arv-bin-vazia? (esquerda (ab)) or arv-bin-vazia? (direita (ab)) ) ) = true então conta-nodos-sfe (esquerda (ab)) + conta-nodos-sfe (esquerda (ab)) DESIGN ( empregando listas-ternárias aninhadas e notação prefixada como modelo de dados, sendo que um nodo-folha é representado pelo átomo a ele associado ) 1. domínio: união ( C-átomos, C-listas-ternárias ) 2. contra-domínio: 3. precondição: argumento ( ab ) deve pertencer a C-átomos ou a C-listas-ternárias 4. casos base: a) ab é árvore-vazia b) ab é lista-vazia 5. valor da função nos casos base: a) 0 b) 1 6. teste de término no caso base: a) ab é lista-vazia? b) ab é átomo? 7. chamadas recursivas: sobre sub-árvore-esquerda (SAE) e/ou sub-árvore-direita (SAD) 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: se ab não for folha e SAE for árvore vazia, soma-se 1 ao valor produzido pela chamada recursiva sobre SAD; se ab não for folha e SAD for árvore vazia, nada deve ser feito com o valor produzido pela chamada recursiva sobre SAE; se as duas sub-árvores de ab não forem vazias, devem ser somados os valores produzidos pelas chamadas recursivas sobre SAE e SAD. Método Indutivo para Resolver Problemas B. Maffeo página 25 de 38

26 FUNÇÕES RECURSIVAS TEMPLATE PARA IMPLEMENTAÇÃO EM SCHEME USO DO ROTEIRO PARA O DESIGN para tratar de problemas simples, usar a expressão if ( um caso base e uma chamada recursiva) (define func-rec (lambda (domínio) (if expressão para testar CASO BASE expressão para gerar o valor da função no CASO BASE ( o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função chamada recursiva ) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 26 de 38

27 FUNÇÕES RECURSIVAS TEMPLATE PARA IMPLEMENTAÇÃO EM SCHEME USO DO ROTEIRO PARA O DESIGN (em Scheme) para tratar de problemas complexos, usar a expressão cond ( mais de um caso base e/ou mais de uma chamada recursiva) (define func-rec (lambda (domínio) (cond ( teste-cb1 expressão para valor da função no CB1 ) ( teste-cb2 expressão para valor da função no CB2 ) ) )) ( teste ( o que deve ser feito... chamada recursiva ) ) ( else ( o que deve ser feito... chamada recursiva ) ) Método Indutivo para Resolver Problemas B. Maffeo página 27 de 38

28 FUNÇÃO FATORIAL Problema: calcular o fatorial de n. DESIGN 1. domínio: 2. contra-domínio: 3. precondição: argumento ( n ) deve pertencer a 4. caso base: n=0 5. valor da função no caso base: 1 6. teste de término no caso base: n=0? 7. chamada recursiva: sobre n-1 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: multiplicar por n o valor (um número) produzido pela chamada recursiva. IMPLEMENTAÇÃO ( em Scheme ) (define fat (lambda (n) (if (zero? n) 1 (* n (fat (- n 1))) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 28 de 38

29 PROCESSAMENTO DE SEQÜÊNCIAS SOMA DOS NÚMEROS DE UMA SEQÜÊNCIA Problema: definir a função soma-seqüência (seq). DESIGN ( empregando lista como modelo de dados ) 1. domínio: C-listas 2. contra-domínio: R 3. precondição: argumento ( lista ) deve pertencer a C-listas e seus itens devem ser números reais 4. caso base: argumento é lista-vazia 5. valor da função no caso base: 0 6. teste de término no caso base: argumento é lista-vazia? 7. chamada recursiva: sobre a cauda do argumento 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: somar, ao valor (um número) produzido pela chamada recursiva, o cabeça do argumento. IMPLEMENTAÇÃO ( em Scheme ) (define soma-lista (lambda (lista) (if (null? lista) 0 (+ (car lista) (soma-lista (cdr lista))) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 29 de 38

30 PROCESSAMENTO DE SEQÜÊNCIAS SOMAR 1 AOS NÚMEROS DE UMA SEQÜÊNCIA Problema: definir a função soma-um (seq) que constrói uma seqüência contendo, na mesma ordem, os números de uma seqüência seq incrementados de 1. DESIGN ( empregando lista como modelo de dados ) 1. domínio: C-listas 2. contra-domínio: C-listas 3. precondição: argumento ( lista ) deve pertencer a C-listas e seus itens devem ser números reais 4. caso base: argumento é lista-vazia 5. valor da função no caso base: lista-vazia 6. teste de término no caso base: argumento é lista-vazia? 7. chamada recursiva: sobre a cauda do argumento 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o valor do cabeça do argumento incrementado de uma unidade. IMPLEMENTAÇÃO ( em Scheme ) (define soma-um (lambda (lista) (if (null? lista) ( ) (cons (+ (car lista) 1) (soma-um (cdr lista)))) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 30 de 38

31 PROCESSAMENTO DE SEQÜÊNCIAS VERIFICAR SE UM ITEM ESTÁ CONTIDO EM UMA SEQÜÊNCIA Problema: definir a função pertence-seq? (item, seq) que verifica se o valor de item está contido na seqüência seq. DESIGN ( empregando lista como modelo de dados ) 1. domínio: C-itens x C-listas 2. contra-domínio: { true, false } 3. precondição: primeiro argumento ( item ) deve pertencer a C-itens e segundo argumento ( lista ) deve pertencer a C-listas 4. casos base: a) lista é lista-vazia b) cabeça de lista é igual a item 5. valor da função nos casos base: a) false b) true 6. teste de término no caso base: a) lista é lista-vazia? b) ( (cabeça de lista) = item )? 7. chamada recursiva: sobre item e a cauda de lista 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada. IMPLEMENTAÇÃO ( em Scheme ) (define pertence-lista? (lambda (item, lista) (cond ( (null? lista) #f) ( (equal? (car lista) item) #t) (else (pertence-lista? item (cdr lista))) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 31 de 38

32 PROCESSAMENTO DE CONJUNTOS VERIFICAR SE UM CONJUNTO É SUBCONJUNTO IMPRÓPRIO DE OUTRO ( todo elemento de um está contido no outro ) Problema: definir a função subconjunto? (conj1, conj2) que verifica se todo elemento de conj1 pertence a conj2. DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: { true, false } 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia c) cabeça de conj1 não está contido em conj2 5. valor da função nos casos base: a) true b) false c) false 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? c) not ( (cabeça de conj1) pertence a conj2 )? 7. chamada recursiva: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada. IMPLEMENTAÇÃO ( em Scheme, usando operações básicas do TAD CONJUNTO ) (define subconjunto? (lambda (conj1 conj2) (cond ( (conj-vazio? conj1) #t) ( (conj-vazio? conj2) #f) ( (not (pertence-conj? (car conj1) conj2)) #f) (else (subconjunto? (cdr conj1) conj2)) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 32 de 38

33 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A UNIÃO DE DOIS CONJUNTOS ( elementos pertencentes a um ou a outro conjunto ) Problema: definir a função união (conj1, conj2) que constrói um conjunto onde cada elemento pertence a conj1 ou a conj2. DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: C-listas 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia 5. valor da função nos casos base: a) conj2 b) conj1 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? 7. chamadas recursivas: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada, se o cabeça de conj1 pertencer a conj2; no caso contrário, acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o cabeça de conj1. IMPLEMENTAÇÃO ( em Scheme, usando operações básicas do TAD CONJUNTO ) (define uniao (lambda (conj1 conj2) (cond ( (conj-vazio? conj1) conj2) ( (conj-vazio? conj2) conj1) ( (pertence-conj? (car conj1) conj2) (uniao (cdr conj1) conj2)) (else (cons (car conj1) (uniao (cdr conj1) conj2))) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 33 de 38

34 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A INTERSEÇÃO DE DOIS CONJUNTOS ( elementos pertencentes a um e a outro conjunto ) Problema: definir a função interseção (conj1, conj2) que constrói um conjunto onde cada elemento pertence a conj1 e a conj2. DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: C-listas 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia 5. valor da função nos casos base: a) lista-vazia b) lista-vazia 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? 7. chamadas recursivas: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada, se o cabeça de conj1 não pertencer a conj2; no caso contrário, acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o cabeça de conj1. IMPLEMENTAÇÃO ( em Scheme, usando operações básicas do TAD CONJUNTO ) (define intersecao (lambda (conj1 conj2) (cond ( (conj-vazio? conj1) conj-vazio) ( (conj-vazio? conj2) conj-vazio) ( (pertence-conj? (car conj1) conj2) (cons (car conj1) (intersecao (cdr conj1) conj2)) ) (else (intersecao (cdr conj1) conj2)) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 34 de 38

35 PROCESSAMENTO DE CONJUNTOS CONSTRUIR A DIFERENÇA DE DOIS CONJUNTOS ( elementos de um conjunto que não pertencem ao outro conjunto ) Problema: definir a função diferença (conj1, conj2) que constrói um conjunto contendo os elementos de conj1 que não pertencem a conj2. DESIGN ( empregando lista sem itens repetidos como modelo de dados ) 1. domínio: C-listas x C-listas 2. contra-domínio: C-listas 3. precondição: primeiro e segundo argumentos ( conj1 e conj2 ) devem pertencer a C-listas e seus valores não devem conter repetição de itens 4. casos base: a) conj1 é lista-vazia b) conj2 é lista-vazia 5. valor da função nos casos base: a) lista-vazia b) valor de conj1 6. teste de término no caso base: a) conj1 é lista-vazia? b) conj2 é lista-vazia? 7. chamadas recursivas: sobre a cauda de conj1 e conj2 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: nada, se o cabeça de conj1 pertencer a conj2; no caso contrário, acrescentar, na primeira posição do valor (uma lista) produzido pela chamada recursiva, o cabeça de conj1. IMPLEMENTAÇÃO ( em Scheme, usando operações básicas do TAD CONJUNTO ) (define diferenca (lambda (conj1 conj2) (cond ( (conj-vazio? conj1) conj-vazio) ( (conj-vazio? conj2) conj1) ( (not (pertence-conj? (car conj1) conj2)) (cons (car conj1) (diferenca (cdr conj1) conj2)) ) (else (diferenca (cdr conj1) conj2)) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 35 de 38

36 PROCESSAMENTO DE ÁRVORES BINÁRIAS CALCULAR QUANTOS NODOS NÃO POSSUEM FILHO À ESQUERDA Problema: definir a função conta-nodos-sfe (ab) que calcula quantos nodos de ab não possuem filho à esquerda. DESIGN ( empregando listas-ternárias aninhadas e notação prefixada como modelo de dados, sendo que um nodo-folha é representado pelo átomo a ele associado ) 1. domínio: união ( C-átomos, C-listas-ternárias ) 2. contra-domínio: 3. precondição: argumento ( ab ) deve pertencer a C-átomos ou a C-listas-ternárias 4. casos base: a) ab é árvore-vazia b) ab é lista-vazia 5. valor da função nos casos base: a) 0 b) 1 6. teste de término no caso base: a) ab é lista-vazia? b) ab é átomo? 7. chamadas recursivas: sobre sub-árvore-esquerda (SAE) e/ou sub-árvore-direita (SAD) 8. o que deve ser feito para, usando o valor produzido pela chamada recursiva, gerar o valor a ser retornado pela função: se ab não for folha e SAE for árvore vazia, soma-se 1 ao valor produzido pela chamada recursiva sobre SAD; se ab não for folha e SAD for árvore vazia, nada deve ser feito com o valor produzido pela chamada recursiva sobre SAE; se as duas sub-árvores de ab não forem vazias, devem ser somados os valores produzidos pelas chamadas recursivas sobre SAE e SAD. IMPLEMENTAÇÃO ( em Scheme, usando operações básicas do TAD ÁRVORE BINÁRIA ) (define conta-nodos-sfe (lambda (ab) (cond ( (arv-bin-vazia? ab) 0) ( (folha? ab) 1) ( (and (arv-bin-vazia? (esquerda ab)) (not (folha? ab))) (+ 1 (conta-nodos-sfe (direita ab))) ) ( (and (arv-bin-vazia? (direita ab)) (not (folha? ab))) (conta-nodos-sfe (esquerda ab)) ) (else (+ (conta-nodos-sfe (esquerda ab)) (conta-nodos-sfe (direita ab)) )) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 36 de 38

37 Analisando-se o código em Scheme, percebe-se que, tendo em vista a semântica da expressão cond, é possível simplificar a solução proposta pois: o teste não-folha? (ab) das cláusula 3 e 4 pode ser omitido, pois o teste folha? (ab) da cláusula 2 garante que seu resultado será sempre true a cláusula 4 pode ser omitida pois a mesma chamada recursiva sobre SAE está sendo também realizada na cláusula 5. Assim, uma versão mais simples será: (define conta-nodos-sfe (lambda (ab) (cond ( (arv-bin-vazia? ab) 0) ( (folha? ab) 1) ( (arv-bin-vazia? (esquerda ab)) (+ 1 (conta-nodos-sfe (direita ab))) ) (else (+ (conta-nodos-sfe (esquerda ab)) (conta-nodos-sfe (direita ab)) )) ) )) Método Indutivo para Resolver Problemas B. Maffeo página 37 de 38

38 Agradecimento Ao professor Bruno Feijó, pelas inúmeras sugestões que contribuíram significativamente para a primeira seção deste texto, intitulada Método Indutivo. Método Indutivo para Resolver Problemas B. Maffeo página 38 de 38

Programação II RECURSÃO

Programação II RECURSÃO Programação II RECURSÃO Bruno Feijó Dept. de Informática, PUC-Rio Motivação Escher: Metamorphosis (1937) - Drawing Hands (1948) Relativity (1953) http://www.worldofescher.com/gallery/ Alguém diz: Esta

Leia mais

ÁRVORES E ÁRVORES BINÁRIAS. Adaptado de Alexandre P

ÁRVORES E ÁRVORES BINÁRIAS. Adaptado de Alexandre P ÁRVORES E ÁRVORES BINÁRIAS Adaptado de Alexandre P ROTEIRO Contextualização Árvores Árvores Binárias ROTEIRO Contextualização Árvores Árvores Binárias CONTEXTUALIZAÇÃO Importância de estruturas unidimensionais

Leia mais

Revisão: Tipo Abstrato de Dados Recursividade

Revisão: Tipo Abstrato de Dados Recursividade Algoritmos e Estrutura de Dados II Revisão: Tipo Abstrato de Dados Recursividade Prof a Karina Oliveira kkco@dei.unicap.br Introdução Estudo das estruturas de dados envolve dois objetivos complementares:

Leia mais

Técnicas de projeto de algoritmos: Indução

Técnicas de projeto de algoritmos: Indução Técnicas de projeto de algoritmos: Indução ACH2002 - Introdução à Ciência da Computação II Delano M. Beder Escola de Artes, Ciências e Humanidades (EACH) Universidade de São Paulo dbeder@usp.br 08/2008

Leia mais

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas Programação Funcional 5 a Aula Definições recursivas Pedro Vasconcelos DCC/FCUP 2014 Definições usando outras funções Podemos definir funções usando outras previamente definidas (e.g. do prelúdio-padrão).

Leia mais

Introdução à Ciência da Computação (ICC) PROVA P2 Sexta-feira 1 de Junho de 2001

Introdução à Ciência da Computação (ICC) PROVA P2 Sexta-feira 1 de Junho de 2001 Introdução à Ciência da Computação (ICC) 2001.1 PROVA P2 Sexta-feira 1 de Junho de 2001 Nome do Aluno: Matrícula PUC: Questões P2 Revisão 1 (1.5) 2 (1.5) 3a (1.0) 3b (1.0) 3c (1.0) 3d (1.0) 4 (2.0) Prova

Leia mais

Inteligência Artificial

Inteligência Artificial Instituto Politécnico de Setúbal Escola Superior de Tecnologia de Setúbal Departamento de Sistemas e Informática Guia de Exercícios Complementares de Lisp Inteligência Artificial Prof Joaquim Filipe Eng.

Leia mais

Aula 2: Algoritmos: Intuição

Aula 2: Algoritmos: Intuição Aula 2: Algoritmos: Intuição Fernanda Passos Universidade Federal Fluminense Programação de Computadores IV Fernanda Passos (UFF) Algoritmos: Intuição Programação de Computadores IV 1 / 27 Agenda 1 Revisão

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Primeiro Teste 16 de Abril de 2011 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 7 páginas com 9 perguntas. A cotação de cada pergunta está assinalada

Leia mais

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca ÁRVORES SUMÁRIO Fundamentos Árvores Binárias Árvores Binárias de Busca 2 ÁRVORES Utilizadas em muitas aplicações Modelam uma hierarquia entre elementos árvore genealógica Diagrama hierárquico de uma organização

Leia mais

;(define conta-folhas ; (lambda ( ) ; (cond ; ( ( ) ) ; ( (and ) ) ; ( else ; ) ) ))

;(define conta-folhas ; (lambda ( ) ; (cond ; ( ( ) ) ; ( (and ) ) ; ( else ; ) ) )) ; ICC 00.2 PROVA 3 ; Gabarito ; QUESTAO 1 (1 ponto) (árvores binárias) ; Complete os espaços em branco na definição abaixo de maneira que ; a função receba uma Árvore Binária de números e retorne o número

Leia mais

Programação Funcional Aulas 5 & 6

Programação Funcional Aulas 5 & 6 Programação Funcional Aulas 5 & 6 Sandra Alves DCC/FCUP 2016/17 Definições usando outras funções Podemos definir funções usando outras previamente definidas (por exemplo: do prelúdio-padrão). Exemplo:

Leia mais

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo Árvore: estrutura composta por nós e arestas entre nós. As arestas são direcionadas ( setas ) e: um nó (e apenas um) é a raiz; todo nó

Leia mais

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO Prof.ª Danielle Casillo Diferentes computadores podem ter diferentes arquiteturas e os diversos tipos de linguagem de programação.

Leia mais

Conceitos de Linguagem de Programação - 2

Conceitos de Linguagem de Programação - 2 Conceitos de Linguagem de Programação - 2 Arthur Jovita Guerra Thalles Santos Silva Universidade Estadual de Santa Cruz - Ilhéus, BA 1 de novembro de 2011 1 Revisão Natureza das linguagens de Programação

Leia mais

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO TEORIA DA COMPUTAÇÃO Aula 03 Programas (Monolítico e Iterativo) Prof.ª Danielle Casillo Programas, Máquinas e Computações Diferentes

Leia mais

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição Recursividade Prof. Cesar Augusto Tacla Métodos iterativos Métodos iterativos utilizam estruturas de repetição For While Do while Normalmente, um método invoca outros métodos, não a si mesmo. 2 1 Recursividade

Leia mais

Prof. A. G. Silva. 25 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de / 35

Prof. A. G. Silva. 25 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de / 35 INE5603 Introdução à POO Prof. A. G. Silva 25 de setembro de 2017 Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de 2017 1 / 35 Baseado em materiais da Recursividade Unisinos, Cesar Tacla (UTFPR),

Leia mais

Árvores Binárias de Busca (ABB) 18/11

Árvores Binárias de Busca (ABB) 18/11 Árvores Binárias de Busca (ABB) 18/11 Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguintes propriedade: Para todo nó da árvore, se seu valor é X, então:

Leia mais

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal. Capítulo 4 TESTES, ESCOLHAS E MALHAS DE REPETIÇÃO 1. INTRODUÇÃO Em muitos exemplos e exercícios realizados nos capítulos anteriores, não foram raras as vezes em que fizemos uso de elementos disponíveis

Leia mais

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA PARA A COMPUTAÇÃO PROF. DANIEL S. FREITAS UFSC - CTC - INE Prof. Daniel S. Freitas - UFSC/CTC/INE/2007 p.1/30 3 - INDUÇÃO E RECURSÃO 3.1) Indução Matemática 3.2)

Leia mais

Árvores Binárias de Busca (ABB) 18/11

Árvores Binárias de Busca (ABB) 18/11 Árvores Binárias de Busca (ABB) 18/11 Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguintes propriedade: Para todo nó da árvore, se seu valor é X, então:

Leia mais

Apêndice 1. Recomendações para testes de módulos

Apêndice 1. Recomendações para testes de módulos Recomendações para testes de módulos - 1 Apêndice 1. Recomendações para testes de módulos O presente conjunto de recomendações tem por objetivo definir um conjunto mínimo de critérios de seleção de casos

Leia mais

Aula 05. Modularização Função Subrotina Recursividade

Aula 05. Modularização Função Subrotina Recursividade Logo Aula 05 Modularização Função Subrotina Recursividade 2 Modularização A modularização é um processo que aborda os aspectos da decomposição de algoritmos em módulos. Módulo é um grupo de comandos, constituindo

Leia mais

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA PARA A COMPUTAÇÃO PROF. DANIEL S. FREITAS UFSC - CTC - INE Prof. Daniel S. Freitas - UFSC/CTC/INE/2007 p.1/26 3 - INDUÇÃO E RECURSÃO 3.1) Indução Matemática 3.2)

Leia mais

Aula prática 5. Funções Recursivas

Aula prática 5. Funções Recursivas Programação Funcional UFOP DECOM 2014.1 Aula prática 5 Funções Recursivas Resumo Definições recursivas são comuns na programação funcional. Nesta aula vamos aprender a definir funções recursivas. Sumário

Leia mais

Subindo uma escada. Ação: Subir 1 degrau da escada

Subindo uma escada. Ação: Subir 1 degrau da escada Recursão Subindo uma escada Ação: Subir 1 degrau da escada 2 Subindo uma escada Ação: Subir 1 degrau da escada 3 Subindo uma escada Ação: E agora??? 4 Subindo uma escada Ação: E agora??? Tem uma escada...

Leia mais

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores. Prof. César Melo DCC/ICE/UFAM Árvores Prof. César Melo DCC/ICE/UFAM Introdução As estruturas anteriores são chamadas de unidimensionais (ou lineares) Exemplo são vetores e listas Não podem ser usadas como hierarquias. Exemplo: árvore

Leia mais

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores. Prof. César Melo DCC/ICE/UFAM Árvores Prof. César Melo DCC/ICE/UFAM Introdução As estruturas anteriores são chamadas de unidimensionais (ou lineares) Exemplo são vetores e listas Não adequadas para representar hierarquias. Exemplo:

Leia mais

MCG114 Programação de Computadores I. Comandos de condição 3/26/18. Comando if. Comando if. Até agora... Comandos de Condição! Comandos de Condição

MCG114 Programação de Computadores I. Comandos de condição 3/26/18. Comando if. Comando if. Até agora... Comandos de Condição! Comandos de Condição 3/26/18 MCG114 Programação de Computadores I Profa. Comandos de condição 20:32:09 1 2 Até agora... Todos os programas têm fluxo de execução único As instruções que serão executadas são sempre as mesmas,

Leia mais

Instituto de Matemática e Estatística, UFF Março de 2011

Instituto de Matemática e Estatística, UFF Março de 2011 ,,,,, Instituto de Matemática e Estatística, UFF Março de 2011 ,, Sumário,,. finitos,. conjunto: por lista, por propriedade.. Igualdade,. Propriedades básicas.. ,, Christos Papadimitriou, Autor dos livros

Leia mais

ALGUMAS ESTRUTURAS MATEMÁTICAS BÁSICAS PARA A CIÊNCIA DA COMPUTAÇÃO

ALGUMAS ESTRUTURAS MATEMÁTICAS BÁSICAS PARA A CIÊNCIA DA COMPUTAÇÃO ALGUMAS ESTRUTURAS MATEMÁTICAS BÁSICAS PARA A CIÊNCIA DA COMPUTAÇÃO Bruno Maffeo Departamento de Informática PUC-Rio CONJUNTOS DEFINIÇÕES BÁSICAS O conceito de conjunto associa-se ao modelo de dados mais

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Soluções do primeiro teste 13 de Novembro de 2004 9:00-10:30 Nota Número: 20 Nome: Turma: Escreva o seu número em todas as folhas do teste. O espaço das respostas deve ser limitado

Leia mais

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013 Lista 1 - PMR2300 Fabio G. Cozman 3 de abril de 2013 1. Qual String é impressa pelo programa: p u b l i c c l a s s What { p u b l i c s t a t i c void f ( i n t x ) { x = 2 ; p u b l i c s t a t i c void

Leia mais

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo PMR2300 Escola Politécnica da Universidade de São Paulo Árvore: estrutura composta por nós e arestas entre nós. As arestas são direcionadas ( setas ) e: um nó (e apenas um) é a raiz; todo nó (exceto a

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Primeiro Teste 21 de Abril de 2012 11:30 13:00 Nome: Número: Esta prova, individual e sem consulta, tem 5 páginas com 10 perguntas. A cotação de cada pergunta está assinalada

Leia mais

1 Conjuntos, Números e Demonstrações

1 Conjuntos, Números e Demonstrações 1 Conjuntos, Números e Demonstrações Definição 1. Um conjunto é qualquer coleção bem especificada de elementos. Para qualquer conjunto A, escrevemos a A para indicar que a é um elemento de A e a / A para

Leia mais

Fundamentos de Algoritmos

Fundamentos de Algoritmos Fundamentos de Algoritmos CIC/UFRGS 2006/1 Mais em definições auto-referenciáveis: roteiro Estruturas em estruturas: exemplo das árvores de hereditariedade Árvores binárias de pesquisa Listas de listas

Leia mais

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo Árvore: estrutura composta por nós e arestas entre nós. As arestas são direcionadas ( setas ) e: um nó (e apenas um) é a raiz; todo nó

Leia mais

Aula 08. Estruturas de dados Árvore e Grafo

Aula 08. Estruturas de dados Árvore e Grafo Logo Aula 08 Estruturas de dados Árvore e Grafo 2 Árvore Estruturas estudadas até agora não são \ adequadas para representar dados que devem ser dispostos de maneira hierárquica Ex., hierarquia de pastas

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Primeiro Teste 6 de Novembro de 200 09:00 0:30 SOLUÇÃO. (.0) Escolha a única afirmação incorrecta. Uma resposta certa vale valor e uma resposta errada desconta 0.4 valores. A.

Leia mais

1 INTRODUÇÃO E CONCEITOS BÁSICOS

1 INTRODUÇÃO E CONCEITOS BÁSICOS 1 INTRODUÇÃO E CONCEITOS BÁSICOS Inicia com uma breve história do surgimento e do desenvolvimento dos conceitos, resultados e formalismos nos quais a Teoria da Computação é baseada. Formalização dos conceitos

Leia mais

IME, UFF 7 de novembro de 2013

IME, UFF 7 de novembro de 2013 em Lógica IME, UFF 7 de novembro de 2013 em Sumário Intermezzo sobre problemas. Intermezzo sobre algoritmos.. em : Val, Sat, Conseq, Equiv, Consist. Redução de problemas. em Um problema computacional é

Leia mais

2. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados.

2. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados. Capítulo 5 Abstracção de dados 5. Exercícios de revisão. Diga o que é um tipo abstracto de informação.. Diga qual é a diferença entre tipos de informação elementares e tipos de informação estruturados.

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br Instituto

Leia mais

Indução. Método de Prova por Indução. Jon Barwise e John Etchemendy, Capítulo: 16

Indução. Método de Prova por Indução. Jon Barwise e John Etchemendy, Capítulo: 16 Indução Método de Prova por Indução Referência: Capítulo: 16 Language, Proof and Logic Jon Barwise e John Etchemendy, 2008 1 Indução Métodos de prova já vistos relacionam-se diretamente com as propriedades

Leia mais

Compiladores - Especificando Sintaxe

Compiladores - Especificando Sintaxe Compiladores - Especificando Sintaxe Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp Análise Sintática A análise sintática agrupa os tokens em uma árvore sintática de acordo com a estrutura

Leia mais

Introdução a Algoritmos Parte 08

Introdução a Algoritmos Parte 08 Universidade Federal do Vale do São Francisco Curso de Engenharia de Computação Introdução a Algoritmos Parte 08 (Baseado no Material do Prof. Marcelo Linder) Prof. Jorge Cavalcanti jorge.cavalcanti@univasf.edu.br

Leia mais

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros: Fontes Bibliográficas Estruturas de Dados Aula 15: Árvores Livros: Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo 13; Projeto de Algoritmos (Nivio Ziviani): Capítulo 5; Estruturas

Leia mais

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro em Haskell Linguagem Haskell Faculdade de Computação - UFU Setembro - 2009 em Haskell 1 em Haskell Noções sobre Construção de por Compreensão Funções Sobre Processamento de Fundamentos em Haskell Noções

Leia mais

Tipo de argumentos. valor. argumentos

Tipo de argumentos. valor. argumentos Operação Numero de argumentos Tipo de argumentos valor (+ ) 2 ou + Numérico Soma ( ) 2 ou + Numérico Subtração ( ) 1 Numérico Simétrico (/ ...) 2 ou + Numérico Divisão (cos

Leia mais

Técnicas de análise de algoritmos

Técnicas de análise de algoritmos CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE MINAS GERAIS Técnicas de análise de algoritmos Algoritmos e Estruturas de Dados I Natália Batista https://sites.google.com/site/nataliacefetmg/ nataliabatista@decom.cefetmg.br

Leia mais

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes Linguagens Formais e Autômatos P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Matemática Discreta para Ciência da Computação - P. Blauth Menezes

Leia mais

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Estruturas de Dados Módulo 17 - Busca 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)

Leia mais

É neste ponto que entra o conceito de lógica de programação.

É neste ponto que entra o conceito de lógica de programação. AULA 01 OBJETIVO: Desenvolvimento e solução de Algoritmos. LÓGICA DE PROGRAMAÇÃO A lógica é a ciência do pensamento correto. Esta declaração não implica, contudo, em afirmar que ela seja a ciência da verdade.

Leia mais

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes Árvores Fabrício J. Barth BandTec - Faculdade de Tecnologia Bandeirantes Setembro de 2011 Tópicos Introdução Árvores binárias Implementação em Java Ordens de percurso em árvores binárias Altura de uma

Leia mais

Universidade de São Paulo

Universidade de São Paulo Universidade de São Paulo Instituto de Ciências Matemáticas e Computação SCE5763 - Tipos e Estrutura de Dados - Luis Gustavo Nonato 2 a Lista de Exercícios 1. Seja A um array de inteiros. Escreva algoritmos

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução da Repescagem do Primeiro Teste 31 de Janeiro de 2013 09:00 10:30 1. De um modo sucinto, (a) (0.5) Diga o que é um processo computacional. Um processo computacional é

Leia mais

Recursividade, Tentativa e Erro

Recursividade, Tentativa e Erro Recursividade, Tentativa e Erro Túlio Toffolo www.toffolo.com.br Marco Antônio Carvalho marco.opt@gmail.com BCC402 Aula 07 Algoritmos e Programação Avançada Na aula anterior Prova 2 Na aula de hoje Técnicas

Leia mais

Linguagens de Programação Aula 14

Linguagens de Programação Aula 14 Linguagens de Programação Aula 14 Celso Olivete Júnior olivete@fct.unesp.br Na aula passada Linguagem Haskell Funções Tipos básicos Expressões 2 Na aula de hoje Linguagem Haskell Listas 3 Listas e Tuplas

Leia mais

Classes, Herança e Interfaces

Classes, Herança e Interfaces Escola de Artes, Ciências e Humanidades EACH-USP ACH2002 Introdução à Ciência da Computação II Professor: Delano Medeiros Beder revisada pelo professor: Luciano Digiampietri EACH Segundo Semestre de 2011

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação Segundo Teste 6 de Janeiro de 2010 09:00 10:30 Nome: Número: Esta prova, individual e sem consulta, tem 8 páginas com 9 perguntas. A cotação de cada pergunta está assinalada

Leia mais

INSTITUTO FEDERAL CATARINENSE Campus Ibirama

INSTITUTO FEDERAL CATARINENSE Campus Ibirama INSTITUTO FEDERAL CATARINENSE Campus Ibirama Estruturas de Decisão Professor Eduardo Stahnke Estruturas de Decisão As estruturas de decisão são utilizadas quando existe a necessidade de verificar condições

Leia mais

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira

Lista de exercícios sobre contagem de operações Prof. João B. Oliveira Lista de exercícios sobre contagem de operações Prof. João B. Oliveira 1. metodo m ( Vetor V ) int i, res = 0; para i de 1 a V.size res = res + V[i]; return res; Soma de elementos de um vetor, O( ). 2.

Leia mais

Aula 2: Linguagem Proposicional

Aula 2: Linguagem Proposicional Lógica para Computação Primeiro Semestre, 2015 Aula 2: Linguagem Proposicional DAINF-UTFPR Prof. Ricardo Dutra da Silva Linguagens naturais, como o nosso Português, podem expressar ideias ambíguas ou imprecisas.

Leia mais

Cálculo Numérico BCC760

Cálculo Numérico BCC760 Cálculo Numérico BCC760 Resolução de Sistemas de Equações Lineares Simultâneas Departamento de Computação Página da disciplina http://www.decom.ufop.br/bcc760/ 1 Introdução! Definição Uma equação é dita

Leia mais

Lógica de Hoare. Abordagem que usaremos: aplicar o método de Hoare sobre uma linguagem de programação imperativa simplificada.

Lógica de Hoare. Abordagem que usaremos: aplicar o método de Hoare sobre uma linguagem de programação imperativa simplificada. Lógica de Hoare Método axiomático para provar que determinados programas são corretos. Introduzido em 1969 por Charles Antony Richard Hoare. Também utilizado para especificar a semântica de linguagens

Leia mais

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes Linguagens Formais e Autômatos P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Matemática Discreta para Ciência da Computação - P. Blauth Menezes

Leia mais

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO. 4 a Lista de Exercícios Gabarito de algumas questões.

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO. 4 a Lista de Exercícios Gabarito de algumas questões. UNIVERSIDADE FEDERAL DO RIO DE JANEIRO DEPARTAMENTO DE CIÊNCIAS DA COMPUTAÇÃO MATEMÁTICA COMBINATÓRIA 4 a Lista de Exercícios Gabarito de algumas questões. Este gabarito foi feito direto no computador

Leia mais

Linguagens Regulares. Prof. Daniel Oliveira

Linguagens Regulares. Prof. Daniel Oliveira Linguagens Regulares Prof. Daniel Oliveira Linguagens Regulares Linguagens Regulares ou Tipo 3 Hierarquia de Chomsky Linguagens Regulares Aborda-se os seguintes formalismos: Autômatos Finitos Expressões

Leia mais

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL

LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL LINGUAGEM C: COMANDOS DE CONTROLE CONDICIONAL Prof. André Backes FLUXOGRAMAS Condição ou Decisão Representado por losangos Normalmente contém uma pergunta do tipo Sim/Não ou um teste de Verdadeiro/Falso.

Leia mais

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti. Sintaxe e Semântica George Darmiton da Cunha Cavalcanti (gdcc@cin.ufpe.br) Tópicos Introdução O problema de descrever a sintaxe Métodos formais para descrever a sintaxe Gramáticas de atributos Descrevendo

Leia mais

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013 Linguagem Haskell Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação Tiago Carneiro 19 Agosto 2013 1 1 Linguagem Haskell Linguagem de programação funcional É um paradigma de programação

Leia mais

Programação Orientada a Objetos. Programação Funcional

Programação Orientada a Objetos. Programação Funcional Programação Orientada a Objetos Programação Funcional Cristiano Lehrer, M.Sc. Introdução (1/3) É uma categoria de linguagens não-imperativas. Imperativas: Uso eficiente das arquiteturas de computadores

Leia mais

Fundamentos da Programação

Fundamentos da Programação Fundamentos da Programação Solução do Exame 13 de Janeiro de 2017 09:00 11:00 1. Indique se cada uma das seguintes afirmações é verdadeira ou falsa. No caso de ser falsa, justifique de forma sucinta. (a)

Leia mais

Algoritmos e Estruturas de Dados I Linguagem C

Algoritmos e Estruturas de Dados I Linguagem C Algoritmos e Estruturas de Dados I (DCC/003) Algoritmos e Estruturas de Dados I Linguagem C Aula Tópico 11 Recursividade 1 Recursão Na linguagem C, uma função pode chamar outra função. A função main()

Leia mais

Lista 2 - PMR2300/3200

Lista 2 - PMR2300/3200 Lista 2 - PMR2300/3200 Fabio G. Cozman, Thiago Martins 8 de março de 2015 1. Qual String é impressa pelo programa: p u b l i c c l a s s What { p u b l i c s t a t i c void f ( i n t x ) { x = 2 ; p u

Leia mais

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio Programação II Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio Árvores Dados organizados de maneira hierárquica Exemplos: arquivos em diretórios, subdivisão de espaço 2D em um

Leia mais

INTRODUÇÃO LINGUAGEM C

INTRODUÇÃO LINGUAGEM C INTRODUÇÃO LINGUAGEM C Aula 1 TECNOLOGIA EM JOGOS DIGITAIS LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Marcelo Henrique dos Santos Marcelo Henrique dos Santos Mestrado em Educação (em andamento) MBA em Negócios

Leia mais

Cálculo Lambda Sem Tipos

Cálculo Lambda Sem Tipos Cálculo Lambda Sem Tipos Cálculo lambda sem tipos Peter Landin (60 s) observou que uma linguagem de programação pode ser compreendida formulando-a em um pequeno núcleo capturando suas características essenciais

Leia mais

Listas generalizadas. SCC-202 Algoritmos e Estruturas de Dados I

Listas generalizadas. SCC-202 Algoritmos e Estruturas de Dados I Listas generalizadas SCC-202 Algoritmos e Estruturas de Dados I Lista generalizada Uma lista generalizada é aquela que pode ter como elemento ou um átomo ou uma outra lista (sub-lista) Átomo: integer,

Leia mais

Instruções de repetição

Instruções de repetição Folha Prática Instruções de repetição 1 Instruções de repetição Repetição (e componentes associadas a qualquer repetição: inicialização, teste da condição de paragem e actualização) Repetição com teste

Leia mais

Linguagens de Programação Funcional

Linguagens de Programação Funcional Linguagens de Programação Funcional Conceitos de Linguagens de Programação Pedro Libório Setembro de 2013 2 Roteiro Introdução Funções matemáticas Fundamentos das linguagens de programação funcionais A

Leia mais

Prof. A. G. Silva. 13 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 13 de setembro de / 21

Prof. A. G. Silva. 13 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 13 de setembro de / 21 INE5603 Introdução à POO Prof. A. G. Silva 13 de setembro de 2017 Prof. A. G. Silva INE5603 Introdução à POO 13 de setembro de 2017 1 / 21 Estruturas de repeteção (INTRODUÇÃO) Prof. A. G. Silva INE5603

Leia mais

Conceitos de Linguagens de Programação

Conceitos de Linguagens de Programação Conceitos de Linguagens de Programação Aula 09 Programação Funcional (Haskell) Edirlei Soares de Lima Programação Funcional A programação funcional modela um problema computacional

Leia mais

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches CT-234 Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural Carlos Alberto Alonso Sanches CT-234 2) Algoritmos recursivos Indução matemática, recursão, recorrências Indução matemática Uma

Leia mais

Prova 1 PMR3201 Computação para Automação 1o. semestre 2016 Prof. Thiago de Castro Martins

Prova 1 PMR3201 Computação para Automação 1o. semestre 2016 Prof. Thiago de Castro Martins Prova 1 PMR3201 Computação para Automação 1o. semestre 2016 Prof. Thiago de Castro Martins 1. (25 pontos) A listagem a seguir mostra o código de uma função que converte uma cadeia de caracteres com a representação

Leia mais

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

04 Recursão SCC201/501 - Introdução à Ciência de Computação II 04 Recursão SCC201/501 - Introdução à Ciência de Computação II Prof. Moacir Ponti Jr. www.icmc.usp.br/~moacir Instituto de Ciências Matemáticas e de Computação USP 2010/2 Moacir Ponti Jr. (ICMCUSP) 04Recursão

Leia mais

AmigoPai. Matemática. Exercícios de Equação de 2 Grau

AmigoPai. Matemática. Exercícios de Equação de 2 Grau AmigoPai Matemática Exercícios de Equação de Grau 1-Mai-017 1 Equações de Grau 1. (Resolvido) Identifique os coeficientes da seguinte equação do segundo grau: 3x (x ) + 17 = 0 O primeiro passo é transformar

Leia mais

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição 1 Comando while Deseja-se calcular o valor de: 1 + 2 + 3 +... + N. Observação: não sabemos, a priori, quantos termos

Leia mais

Trabalho Prático 2015 Simulador de Circuitos Opção 1 Versão /11/2013

Trabalho Prático 2015 Simulador de Circuitos Opção 1 Versão /11/2013 Trabalho Prático 2015 Simulador de Circuitos Opção 1 Versão 1.0 12/11/2013 SSC0300 Linguagem de Programação e Aplicações Engenharia Elétrica - Eletrônica 2º Semestre de 2015 Prof: Daniel Rodrigo Ferraz

Leia mais

Recursividade. Objetivos do módulo. O que é recursividade

Recursividade. Objetivos do módulo. O que é recursividade Recursividade Objetivos do módulo Discutir o conceito de recursividade Mostrar exemplos de situações onde recursividade é importante Discutir a diferença entre recursividade e iteração O que é recursividade

Leia mais

SSC Linguagem de Programação e Aplicações

SSC Linguagem de Programação e Aplicações SSC0300 - Linguagem de Programação e Aplicações Professor responsável: Fernando Santos Osório Semestre: 2013/2 Prof. Auxiliar: Artur Lovato Cunha Estagiário PAE: Rafael L. Klaser Horário: Sexta Manhã 10h10

Leia mais

Semântica Operacional

Semântica Operacional Semântica Conceitos Semântica é o estudo do significado. Incide sobre a relação entre significantes, tais como palavras, frases, sinais e símbolos, e o que eles representam, a sua denotação. Semântica

Leia mais

Aula 05: - Recursão (parte 1)

Aula 05: - Recursão (parte 1) MCTA028 Programação Estruturada Aula 05: - Recursão (parte 1) Prof. João Henrique Kleinschmidt Material elaborado pelo prof. Jesús P. Mena-Chalco 3Q-20108 Recursão: Se você ainda não entendeu; Ver: "Recursão".

Leia mais

Fundamentos de Lógica e Algoritmos. Aula 2.3 Introdução a Algoritmos. Prof. Dr. Bruno Moreno

Fundamentos de Lógica e Algoritmos. Aula 2.3 Introdução a Algoritmos. Prof. Dr. Bruno Moreno Fundamentos de Lógica e Algoritmos Aula 2.3 Introdução a Algoritmos Prof. Dr. Bruno Moreno bruno.moreno@ifrn.edu.br Fundamentos de Lógica e Algoritmos Aula 2.3 Introdução a Algoritmos Prof. Dr. Bruno Moreno

Leia mais

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 Árvores Estrutura de Dados Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 2 Árvore Binária de Busca Definição: uma árvore binária de busca (ABB) é uma árvore binária na qual

Leia mais

Matemática Discreta para Ciência da Computação

Matemática Discreta para Ciência da Computação Matemática Discreta para Ciência da Computação P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Matemática Discreta para Ciência da Computação

Leia mais

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich Árvores Binárias SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista. Figuras editadas por Isadora Maria Mendes http://www.icmc.usp.br/~paulovic

Leia mais

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira. Algoritmos e Estrutura de Dados II Árvore Prof a Karina Oliveira kkco@dei.unicap.br Introdução Estruturas de dados lineares (pilha, fila) são estruturas que guardam coleções de elementos que são acessados

Leia mais