Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

Documentos relacionados
Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Introdução à Ciência da Computação. Sumário. Modularização de Algoritmos. Agradecimentos. Modularização de Algoritmos e Funções em C

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Recursão em C

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

SCC Capítulo 2 Recursão

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Programação de Computadores II. Cap. 4 Funções

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

ESTRUTURA DE DADOS (TCC )

Escopo das Variáveis. Funções. Funções. Funções. Funções. Algoritmos e Lógica de Programação. Programação Estruturada Funções Recursividade

Programação Estruturada

ALGORITMOS I. Procedimentos e Funções

Recursividade. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

Subprogramas. (ou Sub-rotinas) em C: Procedimentos e Funções. 2015/1 Programação Básica de Computadores (INF 09325)

Algoritmos e Estruturas de Dados I Linguagem C

Sub-rotinas. 2014/2 Programação Básica de Computadores (INF 09325) Freddy Brasileiro

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Modularidade - Funções e Procedimentos

Aula prática 5. Funções Recursivas

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Recursividade

Análise de Algoritmos Parte 4

Subprogramas. Prof. Carlos Lopes

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Módulo 7. Funções. Algoritmos e Estruturas de Dados I C++ (Rone Ilídio)

Recursividade. Recursividade

Aula 13 Oficina de Programação Modularização. Profa. Elaine Faria UFU

Programação científica C++

Introdução à Ciência da Computação. Sumário. Estruturas de Dados. Agradecimentos. Arranjos: Vetores, Strings & Matrizes em C

Introdução a Programação de Jogos

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

Linguagem de Programação. Thiago Leite Francisco Barretto

Algoritmos e Estruturas de Dados

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Introdução a Computação

LISTA DE EXERCÍCIOS MÊS 04

Laboratório de 13 de maio de 2019

Algoritmos e Estruturas de Dados

Introdução a Algoritmos Parte 08

Programação II RECURSÃO

Recursão. Definição. Características. Recursividade 31/08/2010

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Capacitação em Linguagem C Parte 1

Conhecendo a Linguagem de Programação C

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

Modularização de Programas

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

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

INF 1007 Programação II

5COP088. Aula 2 Linguagem Estruturada Prof. Dr. Sylvio Barbon Junior. Laboratório de Programação. Aula 2 Linguagem Estruturada

Introdução à Linguagem C Variáveis e Expressões

Modularidade - Fun ções e Procedimentos

Linguagem C: Elementos fundamentais

Capítulo 4: Programando com Funções. Pontifícia Universidade Católica Departamento de Informática

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

MC102 Algoritmos e Programação de Computadores

Programação Estruturada

Linguagem C: Subprogramação

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

Recursão. Introdução à Ciência da Computação II(2009/2010) Rosane Minghim. Apoio na confecção: Rogério Eduardo Garcia Danilo Medeiros Eler

Algoritmos e Estruturas de Dados I (DCC/003) Funções

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Algoritmos e Estruturas de Dados I 01/2013. Vetores e Recursividade. Pedro O.S. Vaz de Melo

Programação de Computadores II. Cap. 5 Vetores

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

Introdução à Programação

Recursividade. Prof. Jesus José de Oliveira Neto

Programação de Computadores II

INF1005: Programação 1. Vetores. 02/05/10 (c) Paula Rodrigues 1

Recursão David Déharbe

Linguagem C: Algoritmos de Ordenação

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

Introdução à Ciência da Computação

3. Linguagem de Programação C

Adriano Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Material sobre Funções AEDS 1

MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

Linguagem C. André Tavares da Silva.

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Sub-rotinas David Déharbe

Algoritmos e Modelação Computacional. Paulo Mateus MEBiom LMAC 2018

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

ponteiros INF Programação I Prof. Roberto Azevedo

MAC 2166 Introdução à Computação para Engenharia

3. Linguagem de Programação C

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

INF 1007 Programação II

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

Algoritmos e Programação

Linguagem C ponteiros

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Aula 18: Funções em C

Introdução à Programação

Transcrição:

Estruturas de Dados Revisão de Funções e Recursão Prof. Ricardo J. G. B. Campello Agradecimentos Parte dos slides a seguir são adaptações dos originais em Pascal gentilmente cedidos pelo Prof. Rudinei Goularte 1

Sumário Funções em C Declaração, Escopo e Tipos de Passagem Funções Pré-Definidas em Bibliotecas Ativação de Funções Recursão Definição e Características Tipos de Recursão Funções em C Podemos ver uma função em C como uma rotina que recebe ou não valores como argumentos e retorna ou não explicitamente um valor Declaração: tipo nome (lista de parâmetros) { Exemplo: corpo da função (incluindo declarações de vars. locais) double quadrado (double x) { return x*x; 2

Funções em C Funções que não retornam valores são do tipo void void também é usado para indicar a inexistência de parâmetros Exemplo: void hello(void){ printf("hello World!"); O retorno de valor é feito através do comando return return interrompe imediatamente o fluxo de execução e retorna o valor especificado Funções em C Escopo: As variáveis declaradas dentro de uma função possuem escopo local, ou seja, provisório e interno à função Variáveis globais são declaradas no início de qualquer módulo (arquivo) de programa, fora de qualquer função incluindo main! Passagem de Parâmetros: Em geral, por valor (uma cópia do parâmetro é feita) Para forçar passagem por referência, é preciso utilizar ponteiros É o que ocorre necessariamente com arranjos (vetores/matrizes) 3

Funções Pré-Definidas As linguagens de programação têm à sua disposição várias funções pré-definidas Em C, essas funções são organizadas em bibliotecas Exemplo (Biblio. Matemática C ANSI #include <math.h>): pow(b,e) base b elevada ao expoente e sqrt(x) raiz quadrada de x Parâmetro formal Identificador (nome) Ativação de Funções Ativação e captura do resultado de uma função pode ser: Por atribuição direta do retorno a uma variável do mesmo tipo Por uso do retorno dentro de uma expressão Exemplo (H é real, A e Y são inteiros ou reais): H = sqrt(a + pow(y,2) + 2 * sin(y)); atribuição direta uso em expressão 4

Exemplo Dados dois números N e K, calcular a Combinação: C ( N, K ) N! = K!( N K)! Se existisse uma função fat(x) que calculasse o fatorial de um dado X, o cálculo acima ficaria: C[N,K] = fat(n) / (fat(k) * fat(n-k)) Se não existe, podemos defini-la função FAT(inteiro: X): retorna inteiro; início inteiro: P, I; P 1; para I de 1 até X faça P P * I; retorne P; fim Exemplo long int FAT(long int X){ long int I, P; P = 1; for(i=1; I<=X; I++) P=P*I; return P; 5

Exemplo #include <stdio.h> long int FAT(long int X); void main(void){ long int N, K, C; printf("entre com N:"); scanf("%d", &N); printf("entre com K:"); scanf("%d", &K); C = FAT(N)/(FAT(K)*FAT(N-K)); printf("\n C(N,K) = %d", C); /* continua... */ /* continua... */ long int FAT(long int X){ long int I, P; P = 1; for(i=1; I<=X; I++) P*=I; return P; Recursão Um procedimento ou função é dito recursivo se chama a si mesmo Muitas definições computacionais são (ou podem ser) recursivas. Exemplo: Sistemas Diretório-Arquivo consistem de um diretório cujo conteúdo consiste de arquivos e possivelmente outros diretórios Conceito está intimamente ligado com os conceitos matemáticos de relação de recorrência e indução a n = 2 a n-1, a 0 = 1 a n = 2 n 6

Recursão Em C, qualquer função pode ser usada recursivamente Exemplo: cálculo do fatorial long int FAT(long int x) { if (x == 1) return 1; else return x*fat(x 1); OU long int FAT(long int x) { return (x == 1? 1 : x*fat(x 1) ); /* EPC: Modifique para funcionar para x = 0 */ Recursão Exige condição de parada e mudança de estado ou entra em ciclo infinito até estourar a pilha de recursão Quais são elas no código recursivo do fatorial??? Vantagens Muitos problemas são intrinsecamente recursivos Código possivelmente mais claro (simples) Desvantagens Velocidade (chamadas a módulos demandam tempo) Uso adicional de memória (pilha de recursão) Análise teórica possivelmente mais complexa 7

Recursão float vetsum(float v[], int n){ if (n == 0) return v[0]; else return ( v[n] + vetsum(v, n 1) ); retorna 15 + v [4] = 15 + 5 = 20 vetsum(v,4) retorna 13 + v [3] = 13 + 2 = 15 vetsum(v,3) Traço de recursão: Exemplo com v = [4 3 6 2 5] vetsum(v,2) vetsum(v,1) vetsum(v,0) retorna 7 + v [2] = 7 + 6 = 13 retorna 4 + v [1] = 4 + 3 = 7 retorna v [0] = 4 Recursão Alguns Tipos de Recursão: Recursão Linear: Módulo com apenas uma chamada recursiva Recursão Binária: Módulo com duas chamadas recursivas Recursão Múltipla: Módulo com múltiplas chamadas recursivas Recursão Indireta: Módulo A chama B que chama A Recursão de Cauda: Recursão linear cuja chamada recursiva é a última operação do módulo Note que, tecnicamente, a recursão da função fat vista anteriormente não é de cauda, mesmo estando na última declaração do módulo: de fato, a última operação do módulo é uma multiplicação no entanto, é usual chamar esse tipo de recursão como de cauda 8

Recursão Sempre existe versão iterativa de um programa recursivo Conversão nem sempre é trivial Normalmente simples para recursão do tipo cauda Exemplo 1: impressão de vetor void printvet(float v[], int i, int f){ if (i<=f){ printf("%f ", v[i]); printvet(v,i+1,f); /* recursão de cauda */ Recursivo Iterativo void printvet(float v[], int i, int f){ int j; for (j=i; j<=f; j++) printf("%f ", v[j]); Recursão Exemplo 2: inversão de vetor void invvet(float v[], int i, int f){ float aux; if (i<f){ aux = v[i]; v[i] = v[f]; v[f] = aux; invvet(v,i+1,f 1); Exercício: A recursão acima é de cauda? Como é a versão iterativa dessa mesma função? 9

Recursão Situações onde se recomenda usar recursão: Quando o problema é intrinsecamente recursivo (e.g. Série de Fibonacci) e sua solução como tal traz maior clareza e não implica ineficiência em termos de tempo de execução e uso de memória. Situações onde se deve evitar recursão: Quando existe um algoritmo iterativo igualmente claro e simples P. ex. quando a recursão é de cauda P. ex. quando uma única recursão já leva à condição de parada Quando a recursão é ineficiente perante a uma versão iterativa P. ex. quando muitos parâmetros são passados por valor P. ex. quando pode haver sobrecarga da pilha de recursão Exercícios Qual o efeito final de inverter as linhas 3 e 4 do procedimento recursivo printvet visto anteriormente? Escreva uma função recursiva que receba uma base real e um expoente inteiro e retorne o valor da base elevada ao expoente. É simples provar por indução matemática que a relação de recorrência T n = 2T n 1 + 1 é, para T 0 = 0, equivalente a T n = 2 n 1. Escreva duas funções que recebam um inteiro n e retornem T n, sendo uma recursiva e a outra não. Implemente uma função para calcular o n-ésimo elemento da seqüência de Fibinacci de forma recursiva. 10

Bibliografia Schildt, H. "C Completo e Total", 3a. Edição, Pearson, 1997. Damas, L. Linguagem C, 10a. Edição, LTC, 2007 11