Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.

Slides:



Advertisements
Apresentações semelhantes
Estrutura de Dados Pilha by Aquiles Burlamaqui. Definição Uma pilha é uma das várias estruturas de dados que admitem remoção de elementos e inserção de.
Advertisements

Funções em C Prof. Fabiano Utiyama.
Programação em Java Prof. Maurício Braga
Recursividade Inhaúma Neves Ferraz
Capítulo VIII – Subprogramação
Estruturas de Repetição
Recursividade Função recursiva é aquela que chama a si própria.
Recursividade Prof. Rosana Palazon.
Algoritmos de manipulação de estruturas elementares de dados
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
Recursividade Prof. Alex F. V. Machado
Algoritmos e Programação Linguagens de Programação Teoria Aula 7 (19/05) Universidade Federal do Vale do São.
Algoritmos e Programação Linguagens de Programação Teoria Aula (09/06)
Algoritmos e Estrutura de Dados I
Introdução à Computação - Jorge Macêdo
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Recursividade Inhaúma Neves Ferraz
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Alocação Dinâmica de Memória
Recursividade Conceitos e Aplicações.
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Linguagem C Funções.
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Fundamentos de Programação 1
Revisão da Linguagem C.
APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C AULA 04: Funções Maceió, Maio de 2010.
Introdução à Programação
PROGRAMAÇÃO ESTRUTURADA II
PROGRAMAÇÃO ESTRUTURADA II
INTELIGÊNCIA ARTIFICIAL
CADEIA DE CARACTERES (Strings)
Algoritmos Recursivos Klauko Mota. Conceito de Recursividade Um programa recursivo é um programa que chama a si mesmo, direta ou indiretamente Conceito.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
UNIDADE 6 - complemento Funções recursivas
PROGRAMAÇÃO I UNIDADE 4.
Programação II Estruturas de Dados Aula 02 - continuação
Introdução à Programação Orientada a Objetos com Java Paulo Borba Centro de Informática Universidade Federal de Pernambuco Programação Imperativa (e Ponteiros.
Ambiente de Execução - Rotinas
Técnicas de Desenvolvimento de Programas
Algoritmos e Estruturas de Dados I – Recursão
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Estruturas de Dados Aula 11: TAD Pilha
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Capítulo VIII Ambientes de Execução
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Introdução à Linguagem C
Regras de escopo Escopo: trecho de codificação no qual o identificador possui significado Escopo de função: identificador válido dentro do trecho de uma.
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Recursividade Bruno Silva.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade.
Aula Prática 5 Monitoria IP/CC (~if669). Roteiro 1. 1.Recursão 2. 2.Escopo de Variáveis 3. 3.Arrays 4. 4.Strings.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Recursividade Profs. De Prog2 e Lab2.
Ciência da Computação 1 PROGRAMAÇÃO ESTRUTURADA II Profª. Noeli.
Ponteiros em C Prof. Kariston Pereira
PCI- Funções e Procedimentos Profa. Mercedes Gonzales Márquez.
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação.
USP – ICMC – SSC SSC0300 2º Semestre 2015 Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Eletrônica ] 1 Prof. Dr. Daniel Rodrigo.
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
Fundamentos de Programação 1 Aula N. 02 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Laços de Repetição em C”
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Recursividade e análise Cristiano Arbex Valle Vinicius Fernandes dos Santos
Transcrição da apresentação:

Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

Recursão

Recursão é o ato de uma função chamar ela mesma. Uma função que chama a ela mesma é chamada função recursiva. O exemplo padrão de função recursiva é uma função que calcula o fatorial de um número. O fatorial de um número é igual ao produto dos números inteiros de 1 até o número. fatorial de 3 = 3 * 2 * 1 Se você observar com cuidado verá que: fatorial de 3 = 3 * fatorial de 2 fatorial de 2 = 2 * fatorial de 1 fatorial de 1 = 1 * fatorial de 0 Ou seja fatorial de um número = número * (fatorial de número - 1)

Fatorial recursivo Definição não recursiva (tradicional): N! = 1, para N = 0. N! = 1 x 2 x 3 x.... x N, para N>0 Definição recursiva: N! = 1, para N = 0; N! = N x (N - 1)!, para N > 0.

Decomposição do Fatorial(3) Fatorial(3) = 3 * Fatorial(2) Fatorial(2) = 2 * Fatorial(1) Fatorial(1) = 1*Fatorial(0) Fatorial(0)=1 Fatorial(1) = 1*1 = 1 Fatorial(2) = 2 * 1 = 2 Fatorial(3) = 3 * 2 = 6

Características dos programas recursivos a)Chama a si mesmo para resolver parte do problema; chamada recursiva b)Existe pelo menos um caso base que é resolvido sem chamar a si mesmo. Condição de parada

Projeto para implementar funções recursivas Toda função recursiva possui dois elementos: • Resolver parte do problema (caso base) ou • Reduzir o tamanho do problema (caso geral). No caso do nosso exemplo, Fatorial(0) é o caso base

Recursão /* Exemplo de função recursiva */ #include int fatorial(int nr) { if(nr == 1) return(1); return (nr * fatorial(nr-1) ); } int main() { int a; printf("\nEntre com um valor inteiro :"); scanf("%d",&a); printf("O fatorial de %d é %d\n\n",a, fatorial(a)); return(0); }

Segmentos de memória Stack (pilha): local onde as variáveis locais as funções são armazenadas Armazena os dados de chamadas de funções Dados são “empilhados” no topo da pilha Usa FIFO (First In First Out) Heap: local para os dados alocados dinamicamente, variáveis globais, constantes e definidas como “static” Valores são armazenados de forma “desordenada” Tempo de execução Segmento de código: local onde os dados de código compilados residem p = (int *) malloc... Objetos int main() Int y; Heap Stack Codigo

Chamada de método Quando um método é chamado: é necessários inicializar os parâmetros formais com os valores passados como argumento; sistema precisa saber onde reiniciar a execução do programa; Informações de cada método (variáveis e endereço de retorno) deve ser guardada até o método acabar a sua execução. Mas como o programa diferencia a variável n da primeira chamada da variável n da segunda chamada do método fatorialr? int fatorial(int nr) { if(nr == 1) return(1); return (nr * fatorial(nr-1) ); }

Registro de ativação Registro de ativação: área de memória que guarda o estado de uma função, ou seja: variáveis locais valores dos parâmetros; endereço de retorno (instrução após a chamada do método corrente); valor de retorno. Registro de ativação são criados na pilha em tempo de execução; Existe um registro de ativação (um nó na pilha) para cada método; Quando um método é chamado é criado um registro de ativação para este e este é empilhado na pilha; Quando o método finaliza sua execução o registro de ativação desse método é desalocado.

Registro de ativação Parâmetros e variáveis locais Endereço de retorno Valor de retorno Parâmetros e variáveis locais Endereço de retorno Valor de retorno Parâmetros e variáveis locais Endereço de retorno Valor de retorno Registro de ativação de f1() Registro de ativação de f2() Registro de ativação de f3() Registro de ativação do método main() void f3() { int x = 3; } void f2() { int x = 2; f1(); } void f1() { int x = 1; f2(); } int main() { f1(); } topo

resultado … n=4 PC = 11 n=3 PC=6 n=2 PC=6 Registro de ativação de fat(3) Registro de ativação de fat(2) Registro de ativação de fat(4) fat (4)  main n=1 PC=6 Registro de ativação de fat(1) fatorial de topo 4*fat(3) 3*fat(2) 2*fat(1) 1 =2 =6 =24 3 int fatorial(int n) { 4 if(n == 1) 5 return(1); 6 return (n * fatorial(n-1) ); 7 } 8 9 int main(){ 10 int resultado 11 resultado = fatorial(4); 12 printf(”%d”, resultado); 13 }

Registro de ativação A cada término de FATORIAL, o controle retorna para a expressão onde foi feita a chamada na execução anterior, e o último conjunto de variáveis que foi alocado é liberado nesse momento. Esse mecanismo utiliza uma pilha. A cada nova chamada do método FATORIAL, um novo conjunto de variáveis (n, FATORIAL) é alocado.

Vantagens e Desvantagens Vantagens da recursão Redução do tamanho do código fonte Maior clareza do algoritmo para problemas de definição naturalmente recursiva Desvantagens da recursão Baixo desempenho na execução devido ao tempo para gerenciamento das chamadas Dificuldade de depuração dos subprogramas recursivos, principalmente se a recursão for muito profunda

Evitando recursão A recursão sempre deve ser evitada basicamente por dois fatores. Primeiro que uma função recursiva é difícil de compreender. Segundo que as funções recursivas são mais lentas que suas correspondentes não recursivas. Normalmente uma função recursiva também pode ser escrita com laços de repetição tipo for ou while de modo a remover a recursão.