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

Documentos relacionados
Recursividade. Recursividade

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

Técnicas de Programação: Comandos de Controle de DEE UFPB

Analise o código abaixo:

Programação de Computadores I Funções de Repetição da Linguagem C PROFESSORA CINTIA CAETANO

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

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

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

ponteiros INF Programação I Prof. Roberto Azevedo

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

Linguagem C (repetição)

Aula 4 ESTRUTURAS DE REPETIÇÃO (FOR)

LP II Estrutura de Dados

Linguagem C Controle do Fluxo de Execução. Lógica de Programação

Depuração e Teste de programas C C Depuração e teste de programas C

MC102 Algoritmos e Programação de Computadores

Curso C: Funções e Macros

Programação: Vetores

ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO

Programação. Prof Marcelo Zorzan Prof a Melissa Zanatta

Algoritmos e Programação

Funções de Entrada e Saída Formatada Constantes de barra invertida

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

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

1ª Lista de Exercícios

Linguagem C: Introdução

Linguagem C: Elementos fundamentais

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Programação estruturada

Revisão: Tipo Abstrato de Dados Recursividade

Matrizes em C. Lucas Ferrari de Oliveira Professor Adjunto. Universidade Federal do Paraná

LISTA DE EXERCÍCIOS MÊS 04

Lista de Exercícios II. 01. Desenvolva um programa em C que receba um valor numérico real, verifique e mostre se esse número é positivo.

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

Algoritmos e Estruturas de Dados I

Variáveis, Tipos de Dados e Operadores

SITUAÇÃO VETORES. Imagine o seguinte problema:

Análise de Algoritmos Parte 4

Dados Estruturados Vetores e Matrizes. SCC120 - Introdução à Ciência de Computação

controle de fluxo repetições iterativas

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Computação 2. Aula 5. Profª. Fabiany defines vetor, strings e matriz por parâmetros de função

Alocação Dinâmica em C

Exercícios em C 1 Saulo O. D. Luiz

1) Operadores de auto incremento ++ e auto decremento --

Aula 15 Variáveis Indexadas (vetores)

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Decisão. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Computação 2. Diego Addan Aula 3. Funções

Linguagem C. Funções

Modularização: Funções em C

2º Roteiro de Laboratório Estruturas condicionais

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

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012

Vetores(Arrays) Olimpíadas de Informática. Aulas preparatórias Introdução a Programação em C.

Resumo da matéria: - Sintaxe da definição duma função C: - Diagramas sintácticos do if e dos mecanismos de ciclos em C:

Subprogramas. Prof. Carlos Lopes

INF1005: Programação 1. Repetições. 08/03/10 (c) Paula Rodrigues 1

... Subprogramas Após fazer as tarefas previstas o nosso programa devolve o comando ao sistema operativo. Isto está numa hierarquia onde o nosso progr

Treinamento Olimpíada Brasileira de Informática

12 - Dados Estruturados Vetores, Matrizes e Strings

Introdução a Linguagem C (Parte I) UFPA Sistemas de Informação. Roberto Araujo 2013

Escreva a função e_caracter que verifica se um determinado caracter é um numero ou não. Escreva um Programa de teste da função.

ESTRUTURAS CONDICIONAIS. Baseado nos slides de autoria de Rosely Sanches e Simone Senger de Souza

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

Caracteres e Strings

Vetores(Arrays) Olimpíadas de Informática. Aulas preparatórias Introdução a Programação em C.

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C

Comandos de entrada. e saída. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada.

PROGRAMAÇÃO DE MICROPROCESSADORES 2009 / 2010

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

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

1 Resumo: Matrizes. 2.1 Como declarar uma matriz IME/USP. Departamento de Ciência da Computação

Estruturas de Repetição

Solução para os exercícios

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

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

5 Comando de Seleção Simples e Composta

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

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios.

J. L. Rangel 1. Escreva um programa em C que lê três números inteiros do teclado, e imprime os três números em ordem crescente.

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Computação I (MAB120) DCC/UFRJ

Métodos Computacionais. Strings (Vetor de Caracteres)

Arquivos em C Parte 2

Macros e funções. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Campus Experimental de Sorocaba

Disciplina de Algoritmos e Programação

INF 1620 P1-04/10/03 Questão 1 Nome:

EXERCÍCIO DE SONDAGEM TURMA 01 SEMESTRE DATA: 01/11/2016. Matrícula Nome Nota

Programação Básica. Estrutura de um algoritmo

Algoritmos RESUMO - LINGUAGEM C

Disciplina de Algoritmos e Programação

Curso de C: uma breve introdução

Linguagem de Programação C

Comando Switch. Embora a escada if else-if possa executar testes de várias maneiras, ela não é de maneira nenhuma elegante.

Caracteres e Cadeias de Caracteres

Controlo de Execução. K&R: Capitulo 3

Transcrição:

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Recursão em C Material preparado pela profa Silvana Maria Affonso de Lara 2º semestre de 2010

ROTEIRO DA AULA Definição de recursão Exemplos de recursão Estrutura da recursão Vantagens e desvantagens da recursão 2

RECURSÃO EM C uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Ex: cálculo do fatorial de um número: n! = n * (n - 1)! 3

RECURSÃO EM C A recursão é uma técnica que define um problema em termos de uma ou mais versões menores deste mesmo problema Esta ferramenta pode ser utilizada sempre que for possível expressar a solução de um problema em função do próprio problema 4

EXEMPLO FATORIAL # include <stdio.h> int fatorial ( int n) if (n == 0) /* condição de parada da recursão */ return 1; else if (n < 0) printf ("Erro: fatorial de número negativo!\n"); exit(0); return n*fatorial(n-1); 5

EXEMPLO FATORIAL fatorial(5) => (5 0) return 5 fatorial(4) => (4 0) return 4 fatorial(3) => (3 0) return 3 fatorial(2) => (2 0) return 2 fatorial(1) => (1 0) return 1 fatorial(0) => (0 == 0) <= return 1 <= return 1 1 (1) <= return 2 1 (2) <= return 3 2 (6) <= return 4 6 (24) <= return 5 24 (120) 120 6

/* Faça um programa que calcula e mostra o fatorial de um número inteiro positivo n. (Ex: 0! = 1; 3! = 3*2*1 = 6) */ #include <stdio.h> #include <conio.h> int fatorial (int n) if (n == 0) return 1; else if (n<0) printf("\nerro: fatorial de numero negativo!\n"); getch(); exit(0); return n*fatorial(n-1); 7

int main(void) int n, fat=1; printf("digite um numero inteiro:"); scanf("%d", &n); fat=fatorial(n); printf("\n\no fatorial de %d eh: %d", n, fat); getch(); 8

EX: SOMA N PRIMEIROS NÚMEROS INTEIROS Supondo N = 5; S(5) = 1+2+3+4+5 = 15 -> S(5) = S(4) + 5 -> 10 + 5 = 15 S(4) = 1+2+3+4 =10 -> S(4) = S(3) + 4 -> 6 + 4 = 10 S(3) = 1+2+3 = 6 -> S(3) = S(2) + 3 -> 3 + 3 = 6 S(2) = 1+2 = 3 -> S(2) = S(1) + 2 -> 1 + 2 = 3 S(1) = 1 =1 -> S(1) = 1 --------------->solução trivial 9

RECURSÃO Em procedimentos recursivos pode ocorrer um problema de terminação do programa, como um looping interminável ou infinito. Portanto, para determinar a terminação das repetições, deve-se: 1) Definir uma função que implica em uma condição de terminação (solução trivial), e 2) Provar que a função decresce a cada passo de repetição, permitindo que, eventualmente, esta solução trivial seja atingida. 10

ESTRUTURA DE UMA RECURSÃO uma recursão obedece a uma estrutura que deve conter os seguintes elementos: função (par) teste de término de recursão utilizando par se teste ok, retorna aqui processamento aqui a função processa as informações em par chamada recursiva em par par deve ser modificado de forma que a recursão chegue a um término 11

EX: SOMA N PRIMEIROS NÚMEROS INTEIROS S(N) = 1, se N = 1 (solução trivial) S(N-1) + N, se N > 1(chamada recursiva) main( ) int n; scanf( %d, &n); printf( %d, soma(n)); int soma(int n) if (n == 1) return (1); else return (n + soma(n 1)); 12

EXEMPLO: PRINTD(INT) printd(int) imprime um inteiro usando recursão void printd (int n) if (n < 0) /* imprime sinal */ putchar('-'); n = -n; if (n / 10) /* termino recursao */ printd(n/10); /* recursao se n>10 */ putchar(n % 10 + '0'); /* senao imprime char */ 13

EXEMPLO PRINTD() printd(-1974) ==> (n < 0) --> putchar( - ) - ==>printd(197) - ==> printd(19) - ==> printd(1) - (1 / 10 = = 0) - putchar(1 + 0 ) -1 putchar(19%10 + 0 ) -19 putchar(197%10 + 0 ) -197 putchar(1974 %10 + 0 ) -1974 14

ANALISANDO RECURSIVIDADE Vantagens X Desvantagens Um programa recursivo é mais elegante e menor que a sua versão iterativa, além de exibir com maior clareza o processo utilizado, desde que o problema ou os dados sejam naturalmente definidos através de recorrência. Por outro lado, um programa recursivo exige mais espaço de memória e é, na grande maioria dos casos, mais lento do que a versão iterativa. 15

PRÁTICA 1. Escreva uma função recursiva para calcular o valor de uma base x elevada a um expoente y. 2. Escrever uma função recursiva que retorna o tamanho de um string, tamstring(char s[]) 3. Fazer uma função recursiva que conta o número de ocorrências de um determinado caracter, caract(char c, char s[]) 4. Escreva uma função recursiva que produza o reverso de um string, reverse(char s[]) 16

#include <stdio.h> #include <conio.h> int expo (int x, int y) if (y == 0) return 1; if (y == 1) return x; return x*expo(x,y-1); int main(void) int x, y, e; printf("exponencial de x elevado a y\n\n"); printf("\ndigite o numero inteiro x:"); scanf("%d", &x); printf("\ndigite o numero inteiro y:"); scanf("%d", &y); if (y < 0) printf("y tem que ser maior ou igual a zero!!"); getch(); else e=expo(x,y); printf("\n\nx elevado a y eh: %d", e); getch(); 17

#include <stdio.h> #include <conio.h> int tamstring(char s[]) if (s[0] == '\0') return 0; return 1+tamstring(&s[1]); int main(void) char s[20]; int t; printf("tamanho de string\n\n"); printf("\ndigite a string: "); scanf("%s", s); t=tamstring(s); printf("\n\no tamanho eh %d", t); getch(); 18

/* conta quantas vezes um caractere ocorre em uma string*/ #include <stdio.h> #include <conio.h> int carac(char c,char s[]) if (s[0] == '\0') return 0; if (s[0]==c) return (1+carac(c,++s)); return carac(c,++s); int main(void) char s[30],c; int t; printf("busca em string\n\n"); printf("\ndigite a string: "); gets(s); printf("\ndigite o caractere desejado: "); c=getchar(); t=carac(c,s); printf("\n\nencontrei %d vezes", t); getch(); 19

/* imprime uma string em ordem reversa*/ #include <stdio.h> #include <conio.h> void contrario(char s[]) if (s[0]!= '\0') contrario(&s[1]); printf("%c",s[0]); int main(void) char s[30],c; int t; printf("imprime reverso\n\n"); printf("\ndigite a string: "); gets(s); contrario(s); getch(); 20

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Recursão em C Material preparado pela profa Silvana Maria Affonso de Lara 2º semestre de 2010