Aula1 Recursão
Aula1 Recursão
Aula1 Recursão
Recurso
! uma tcnica de programao na qual um mtodo
chama a si mesmo.
Recursividade
!
IMPLEMENTAO ITERATIVA DA
MULTIPLICAO
MULTIPLICAO RECURSIVA
! Podemos tambm implementar a multiplicao de
MULTIPLICAO RECURSIVA
!
FUNES RECURSIVAS
! Exemplo: Calcular o fatorial de um nmero.
!
Soluo no recursiva
#include <stdio.h>
float fatorial(int n){
float fat = 1.0;
while(n>1){
fat *= n;
n--;
}
return fat;
}
int main(){
float fat;
fat = fatorial(6);
printf("fatorial: %f\n",fat);
return 0;
}
FUNES RECURSIVAS
! Exemplo: Calcular o fatorial de um nmero.
!
#include <stdio.h>
float fatorial(int n){
if(n==0)
//Caso trivial
return 1.0; //Soluo direta
return n*fatorial(n-1); //Chamada recursiva
}
int main(){
float fat;
fat = fatorial(6);
printf("fatorial: %f\n",fat);
return 0;
}
FUNES RECURSIVAS
! Exemplo: Calcular x elevado a n positivo.
!
Soluo no recursiva
#include <stdio.h>
float potencia(float x, int n){
float pot=1.0;
while(n>0){
pot *= x;
n--;
}
return pot;
}
FUNES RECURSIVAS
! Exemplo: Calcular x elevado a n positivo.
!
#include <stdio.h>
float potencia(float x, int n){
if(n==0)
//Caso trivial
return 1.0; //Soluo direta
else
return x*potencia(x, n-1); //Chamada recursiva
}
FUNES RECURSIVAS
! Exemplo: Calcular x elevado a n positivo.
!
#include <stdio.h>
//Funo recursiva mais eficiente
float potencia(float x, int n){
float pot;
if(n==0) return 1.0; //Caso trivial
if(n%2==0){ //Se n par...
pot = potencia(x, n/2);
return pot*pot;
}
else{ //Se n mpar...
pot = potencia(x, n/2);
return pot*pot*x;
}
}
FUNES RECURSIVAS
! Exemplo: Encontrar maior elemento de um
vetor.
!
Soluo recursiva
#include <stdio.h>
int maiorinteiro(int v[], int n){
int m;
if(n==1) return v[0]; //Caso trivial
else{
m = maiorinteiro(v, n-1);
if(m>v[n-1]) return m;
else
return v[n-1];
}
}
int main(){
int max,v[5]={8,1,9,4,2};
max = maiorinteiro(v, 5);
printf("Max: %d\n",max);
return 0;
}
FUNES RECURSIVAS
! Exemplo: Imprimir elementos de um vetor.
!
Soluo no recursiva
#include <stdio.h>
void printvetor(int v[], int n){
int i;
for(i=0; i<n; i++)
printf("%d ",v[i]);
}
! Soluo recursiva
#include <stdio.h>
void printvetor(int v[], int n){
if(n>1)
printvetor(v, n-1);
printf("%d ",v[n-1]);
}
FUNES RECURSIVAS
! Ordenao de vetores:
! Ordenao por seleo (Selection Sort)
! Percorre o vetor selecionando o maior elemento.
! Troca com o da ltima posio, de forma que o maior passa a
ocupar sua posio definitiva.
! Repete o processo para os elementos ainda fora de posio.
! Ordenao por insero (Insertion Sort)
! Ordenamos parte do vetor.
! Pega prximo elemento.
! Insere na posio correta da parte j ordenada.
! Ordenao por permutao (Bubble Sort)
! O vetor percorrido a partir do incio e trocas so feitas
sempre que um elemento for maior que o prximo.
! O maior passa a ocupar sua posio definitiva.
! Repete o processo para os demais elementos fora de posio.
FUNES RECURSIVAS
! Exemplo: Ordenar vetor por seleo.
!
Soluo recursiva
#include <stdio.h>
void selectionsort(int v[], int n){
int i,im,tmp;
if(n>1){
im = 0; //im = ndice do maior valor
for(i=1; i<n; i++)
if(v[i]>v[im]) //Seleciona o maior valor
im = i;
if(im!=n-1){ //Efetua troca
tmp = v[n-1];
v[n-1] = v[im]; //Move maior para o final
v[im] = tmp;
}
selectionsort(v, n-1);
}
}
FUNES RECURSIVAS
! Exemplo: Ordenar vetor por insero.
!
Soluo recursiva
#include <stdio.h>
void insertionsort(int v[], int n){
int i,tmp;
//No caso trivial no faz nada
if(n>1){
insertionsort(v, n-1);
//Insere elemento que falta na posio correta
i = n-1;
while((i>0) && (v[i-1]>v[i])){
tmp = v[i-1];
v[i-1] = v[i];
v[i] = tmp;
i--;
}
}
}
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!
FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
#include <stdio.h>
void hanoi(int n, char orig, char dest, char aux){
if(n==1)
printf("1 -> %c\n",dest);
else{
hanoi(n-1, orig, aux, dest);
printf("%d -> %c\n",n,dest);
hanoi(n-1, aux, dest, orig);
}
}
int main(){
int n;
printf("Nmero de discos: ");
scanf("%d",&n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
Fatorial recursivo
! Definio no recursiva (tradicional):
N! = 1, para N = 0.
Fatorial recursivo
! Definio no recursiva (tradicional):
N! = 1, para N = 0.
Fatorial recursivo
Definio recursiva:
N! = 1, para N <= 1;
N! = N x (N - 1)!, para N > 0.
SEQNCIA DE FIBONACCI
! A seqncia de Fibonacci a seqncia de inteiros:
!
se n==0 OU n==1
se n>=2
SEQNCIA DE FIBONACCI
(IMPLEMENTAO)
fib(n)=n
fib(n)=fib(n-2)+fib(n-1)
se n==0 OU n==1
se n>=2
CHAMADA DE MTODO
!
REGISTRO DE ATIVAO
! Registro de ativao:
! rea de memria que guarda o estado de uma funo, ou seja:
!
variveis locais
valor de retorno.
execuo;
mtodo;
REGISTRO DE ATIVAO
Registro de
ativao de
f3()
Parmetros e
variveis locais
Endereo de retorno
Valor de retorno
Registro de
ativao de
f2()
Parmetros e
variveis locais
Endereo de retorno
Valor de retorno
Registro de
ativao de
f1()
Parmetros e
variveis locais
Endereo de retorno
Valor de retorno
Registro de
ativao do
mtodo
main()
...
topo da pilha
PC=7
Registro de
ativao de
fat(3)
Registro de
ativao de
fat(4)
topo
PC=7
topo
PC=7
6
n=4
PC = 12
24
resultado=24
=24
=6
3*fat(2)
4*fat(3)
2*fat(1)
2
n=3
fatorial de 4
1
n=2
Registro de
ativao de
fat(2)
topo
topo
=2
REGISTRO DE
ATIVAO: EXEMPLO
! A cada trmino de FAT, o controle retorna
linguagem de programao.
Vantagens e Desvantagens
! Vantagens da recurso
!
!
! Desvantagens da recurso
!
!
Traduo X Interpretao
! Uma linguagem de programao pode ser convertida, ou
Traduo X Interpretao
! Se o mtodo utilizado traduz todo o texto do programa
Traduo
! A traduo tipicamente feita em vrias fases, sendo as mais
comuns:
! Anlise lxica
! Anlise sinttica ou Parsing
! Anlise Semntica
! Gerao de cdigo e a Otimizao.
! Em compiladores tambm comum a Gerao de cdigo
intermedirio.
Anlise lxica
! o processo de analisar a entrada de linhas de caracteres (tal
Anlise sinttica
! Tambm conhecida pelo termo em ingls parsing o processo de
Anlise semntica
! um sinnimo de Anlise sinttica e a terceira fase
Gerador de Cdigo
! Dentro do diversificado leque de categorias de ferramentas que
Otimizao
! Em matemtica, o termo otimizao, ou programao
A anlise e projeto orientados a objetos tem como meta identificar o melhor conjunto de
objetos para descrever um sistema de software. O funcionamento deste sistema se d atravs
do relacionamento e troca de mensagens entre estes objetos.
Na programao orientada a objetos, implementa-se um conjunto de classes que definem os
objetos presentes no sistema de software. Cada classe determina o comportamento (definido
nos mtodos) e estados possveis (atributos) de seus objetos, assim como o relacionamento
com outros objetos.
Classificao de Linguagens
! As linguagens de programao podem ser
Classificao da ACM
! A ACM mantm um sistema de classificao com os seguintes sub-
itens:
! Linguagens aplicativas, ou de aplicao
! Linguagens concorrentes, distribudas e paralelas
! Linguagens de fluxo de dados
! Linguagens de projeto
! Linguagens extensveis
! Linguagens de montagem e de macro
! Linguagens de microprogramao
! Linguagens no determinsticas
! Linguagens no procedurais
! Linguagens orientadas a objeto
! Linguagens de aplicao especializada
! Linguagens de altssimo nvel
Quanto ao Paradigma
! Diferentes linguagens de programao podem ser agrupadas
! Linguagem funcional
! Linguagem natural
! Programao lgica
! Programao imperativa
! Programao estruturada
! Linguagem orientada a objetos
smbolos mais complexos, inteligvel pelo ser humano e noexecutvel diretamente pela mquina, no nvel da especificao
de algoritmos, como Pascal, Fortran, ALGOL e SQL.
Quanto gerao
! Primeira gerao, as linguagens de baixo nvel
! Assembly
! Segunda gerao, as primeiras linguagens
! Fortran, ALGOL,...
! Terceira gerao, as procedurais e estruturadas
! Pascal, C.
! Quarta gerao, linguagens que geram programas em outras
linguagens
C
C++
Objec0ve-
C
Modelo de execuo
Inuncias
Paradigma principal
Compilao
Algol, BCPL
Compilao
Modelo
de
0po
Introduo
de
dados
Est0co,
fraco
Incio
de
1970
Est0co,
fraco
1979
Dinmico
e
est0co,
fraco
1986
Compilao
C, Smalltalk
Interpretao
ABC, Perl
Orientada a objectos
Dinmico, forte
1990
Interpretao
Smalltalk, Perl
Orientada a objectos
Dinmico, forte
1995
Mathema
0ca
Interpretao
LISP
Ml0plos paradigmas
Dinmico, forte
1986
C#
Interpretao
e
Compilao
C++
Est0co, forte
2002
Java
Interpretao
e
Compilao
C++
Orientada a objectos
Est0co, forte
1996
Perl
Interpretao
Dinmico
1987
Boo
Interpretao
Python
Orientada a objectos
Est0co
2003
PHP
Interpretao
C e Perl
Orientada a objectos
Dinmico
1995
Harbour
Interpretao
e
Compilao
Clipper e xBase
Dinmico, forte
1999
Python
Ruby
Linguagens acadmicas
Linguagens proprietrias
Linguagens no-proprietrias
Linguagens livres
Linguagens esotricas
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i, n;
teste:
printf("\nDigite um numero");
scanf("%d", &n);
if(n<10)
goto teste;
else if(n==10)
for(i=0;i<n;i++)
printf("%d - nada\n",(i+1));
else goto fim;
O
que
o
cdigo
abaixo
faz?
#include<stdio.h>
#include<stdlib.h>
main(int argc, char *argv[]){
int i,n;
printf("\nDigite um numero");
scanf("%d",&n);
i=n-1;
loop:
n += i;
i--;
if(i<=0)
Frmula Matamtica
Recurso Eficiente
{
fibCalc(20, 0, 1);
}
int fibCalc(int n, int a, int b) { System.out.println(a);
return (n == 0) ? a : fibCalc(--n, a + b, a);
}
Algoritmo em ECMAScript /
JavaScript
function fibonacci(i) {
return i < 2 ? i : fibonacci(i - 1) + fibonacci(i - 2);
} /* Chamando */
for(i = 1; i < 10; i++) {
alert(fibonacci(i));
}
<?php
Algoritmo em PHP
<?php
Algoritmo em Perl
# !/usr/bin/perl
use strict;
sub fibo {
#include <stdio.h>
Algoritmo em C
#include <stdlib.h>
long int fibo(int);
int main(int argc, char** argv) {
setbuf(stdout, NULL);
int n, fib;
printf("Digite N: ");
scanf("%i", &n);
fflush(stdin);
fib = fibo(n);
printf("Fibonacci =%i\n", fib);
printf("\n");
system("PAUSE");/* Tomem cuidado que isso faz o windows parar */
Algoritmo em Ruby
fib(0) -> 0 ;
Algoritmo em Erlang
fib(1) -> 1 ;
fib(N) when N > 0 -> fib(N-1) + fib(N-2).
%% Tail recursive
fibo3(N) ->
{Fib, _} = fibo3(N, {1, 1}, {0, 1}),
Fib.
fibo3(0, _, Pair) -> Pair;
fibo3(N, {Fib1, Fib2}, Pair) when N rem 2 == 0 ->
SquareFib1 = Fib1*Fib1,
fibo3(N div 2, {2*Fib1*Fib2 - SquareFib1, SquareFib1 + Fib2*Fib2}, Pair);
fibo3(N, {FibA1, FibA2}=Pair, {FibB1, FibB2}) ->
Algoritmo em Pascal
program fibonacci (input,output);
var
i,n,ni,ni1,ni2:longint;
begin
writeln ('NME ROS DE FIBONACCI');
write('Quantos termos de Fibonacci voc quer calcular? ');
read(n);
ni:=1;
ni1:=1;
ni2:=0;
for i:=1 to n do
begin
a=0;
Algoritmo em MATLAB
b=1;
c=a+b;
N=0;
while N?0
N=input('Defina limite da sequncia fibonacci: ');
end
while c?N
disp(num2str(c))
a=b;
b=c;
c=a+b;
@echo off
setlocal ENABLEDELAYEDEXPANSION
set/an=-1
set/af0=0
set/af1=1
:loop
set/an+=1
set/am=%n%-1
set/al=%m%-1
set /a f%n%=!f%m%!+!f%l%!
echo F(%n%)=!f%n%!
pause&goto loop
Algoritmo em PROLOG
fib(1, 1).
fib(2, 1).
fib(X, Y):- X > 1, X1 is X - 1, X2 is X - 2, fib(X1, Z), fib(X2, W), Y is W +
Z.
Algoritmo em Tcl
proc fib {n} {
if {$n < "2"} {
return $n
}
return [expr [fib [expr $n - 1]] + [fib [expr $n - 2]]]
}
# Chamando
fib 10
Portugus estruturado
algoritmo "srie de fibonnacci"
se n0<2 entao
var fibo:inteiro
n0,n1,n2:inteiro
leia(aux)
I:inteiro
limpatela
soma:inteiro
fimse
aux: caracter
fimenquanto
inicio
n0:=0
leia(n1)
leia(n2)
leia(n0)
*----------------------
Algoritmo em COBOL
300-FIBONACCI SECTION.
*---------------------IF 999E-REG EQUAL 0
MOVE PNULT TO FIB
ELSE
IF 999E-REG EQUAL 1
MOVE ULT TO FIB
ELSE
MOVE 999E-REG TO GDA-POSICAO
PERFORM 400-CALCULA UNTIL GDA-POSICAO EQUAL 1.
*---------------------------------------------------------------*
*
*-------------------400-CALCULA SECTION.
? Fibonacci(22)
Algoritmo em C#
#include <iostream>
Algoritmo em C++
PROGRAM FIBONACCI
IMPLICIT NONE
fib n
Algoritmo em Haskell
|n==0 = 0
|n==1 = 1
|otherwise = fib(n-1) + fib(n-2)
Algoritmo em Haskell
fibs n = fibGen 0 1 n
fibGen a b n = case n of
0 -> a
n -> fibGen b (a + b) (n - 1)
Tarefa
! Como tarefa, defina qual o paradigma que cada