Aula1 Recursão

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 94

Recursividade

Recurso
! uma tcnica de programao na qual um mtodo

chama a si mesmo.

! Uma funo dita recursiva quando dentro dela

feita uma ou mais chamadas a ela mesma.

! A idia dividir um problema original um

subproblemas menores de mesma natureza (diviso)


e depois combinar as solues obtidas para gerar a
soluo do problema original de tamanho maior
(conquista).

! Os subproblemas so resolvidos recursivamente do

mesmo modo em funo de instncias menores, at


se tornarem problemas triviais que so resolvidos de
forma direta, interrompendo a recurso.

Recursividade
!

Considere por exemplo a operao de multiplicao, em


termos da operao de adio:

Multiplicar m por n (onde n no negativo) somar m, n


vezes:

Uma soluo para os problemas que realizam operaes


repetidamente pode ser implementao usando comandos de
repetio (tambm chamados de comandos iterativos ou
comandos de iterao).

IMPLEMENTAO ITERATIVA DA
MULTIPLICAO

MULTIPLICAO RECURSIVA
! Podemos tambm implementar a multiplicao de

um nmero m por n somando m com a


multiplicao de m por n-1.
! m x n = m+m x (n-1)
! 2x4 = 2 + 2x(3)

! Chamamos novamente a operao de

multiplicao, mas agora para resolver um subproblema que parte do anterior.


Um mtodo que chama a si mesmo
chamado de mtodo recursivo.

MULTIPLICAO RECURSIVA
!

A multiplicao de um nmero inteiro por outro inteiro maior


ou igual a zero pode ser definida recursivamente por induo
matemtica como a seguir:
m x n = 0 se n ==0
m n = m + (m (n 1)) se n > 0

Que pode ser implementado em Java da seguinte maneira:

Recurso o equivalente em programao da


induo matemtica que uma maneira de
definir algo em termos de si mesmo.

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.
!

Soluo recursiva: n! = n.(n-1)!

#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.
!

Soluo recursiva: x^n = x . x^(n-1)

#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.
!

Soluo recursiva: x^n = x^(n/2). x^(n/2) = (x^(n/2))^2

#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
!
!

So dados um conjunto de N discos com diferentes


tamanhos e trs bases A, B e C.
O problema consiste em imprimir os passos
necessrios para transferir os discos da base A para
a base B, usando a base C como auxiliar, nunca
colocando discos maiores sobre menores.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

1 passo: Mover de A para B.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

2 passo: Mover de A para C.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

3 passo: Mover de B para C.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

4 passo: Mover de A para B.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

5 passo: Mover de C para A.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

6 passo: Mover de C para B.

FUNES RECURSIVAS
! Exemplo: Torre de Hanoi
!

7 passo: Mover de A para B.

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.

N! = 1 x 2 x 3 x .... x N, para N>0


! Definio recursiva:
N! = 1, para N = 0;

N! = N x (N - 1)!, para N > 0.

Fatorial recursivo
! Definio no recursiva (tradicional):
N! = 1, para N = 0.

N! = 1 x 2 x 3 x .... x N, para N>0


! implementao iterativa:

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:
!

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

! Cada elemento nessa seqncia a soma dos dois

elementos anteriores. Por exemplo:


!

0+1=1; 1+1=2; 1+2=3; 2+3=5 ...

! Se partirmos que fib(0)=0 e fib(1)=1 e assim por

diante, podemos definir um nmero da seqncia


fibonnaci da seguinte maneira:
fib(n)=n
fib(n)=fib(n-2)+fib(n-1)

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
!

Quando um mtodo chamado:


!

necessrio inicializar os parmetros formais com os


valores passados como argumento;

O sistema precisa saber onde reiniciar a execuo do


programa;

Informaes de cada mtodo (variveis e endereo de


retorno) devem ser guardadas at o mtodo acabar a sua
execuo.

Mas como o programa diferencia a varivel n da primeira


chamada da varivel n da segunda chamada do mtodo
fatorialr?

REGISTRO DE ATIVAO
! Registro de ativao:
! rea de memria que guarda o estado de uma funo, ou seja:
!

variveis locais

valores dos parmetros;

endereo de retorno (instruo aps a chamada do mtodo corrente);

valor de retorno.

! Registro de ativao so criados em uma pilha em tempo de

execuo;

! Existe um registro de ativao (um n na pilha) para cada

mtodo;

! Quando um mtodo chamado criado um registro de

ativao para este e este empilhado na pilha;

! Quando o mtodo finaliza sua execuo o registro de

ativao desse mtodo desalocado.

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

REGISTRO DE ATIVAO: EXEMPLO


n=1
Registro de
ativao de
fat(1)

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

fat (4) main

1
n=2

Registro de
ativao de
fat(2)

topo

topo

=2

REGISTRO DE
ATIVAO: EXEMPLO
! A cada trmino de FAT, o controle retorna

para a expresso onde foi feita a chamada na


execuo anterior, e o ltimo conjunto de
variveis que foi alocado liberado nesse
momento. Esse mecanismo utiliza uma pilha.

! A cada nova chamada do mtodo FAT, um novo

conjunto de variveis (n, FAT) alocado.

Dicas para desenvolver algoritmos recursivos


! Montar, inicialmente, uma definio

(especificao) recursiva do problema, como segue:


1. Definir pelo menos um caso bsico;
2. Quebrar o problema em subproblemas, definindo o(s) caso
(s) recursivo(s);
3. Fazer o teste de finitude, isto , certificar-se de que as
sucessivas chamadas recursivas levam obrigatoriamente,
e numa quantidade finita de vezes, ao(s) caso(s) bsico(s).

! Depois, s traduzir essa especificao para a

linguagem de programao.

Vantagens e Desvantagens
! Vantagens da recurso
!
!

Reduo do tamanho do cdigo fonte


Maior clareza do algoritmo para problemas de definio
naturalmente recursiva

! Desvantagens da recurso
!
!

Baixo desempenho na execuo devido ao tempo para


gerenciamento das chamadas
Dificuldade de depurao dos subprogramas recursivos,
principalmente se a recurso for muito profunda

Traduo X Interpretao
! Uma linguagem de programao pode ser convertida, ou

traduzida, em cdigo de mquina por compilao ou


interpretao, que juntas podem ser chamadas de traduo.
! Se o texto do programa traduzido medida que vai sendo

executado, como em JavaScript, Python ou Perl, num processo


de traduo de trechos seguidos de sua execuo imediata, ento
diz-se que o programa foi interpretado e que o mecanismo
utilizado para a traduo um interpretador. Programas
interpretados so geralmente mais lentos do que os compilados,
mas so tambm geralmente mais flexveis, j que podem
interagir com o ambiente mais facilmente.

Traduo X Interpretao
! Se o mtodo utilizado traduz todo o texto do programa

(tambm chamado de cdigo), para s depois executar (ou


rodar, como se diz no jargo da computao) o programa, ento
diz-se que o programa foi compilado e que o mecanismo
utilizado para a traduo um compilador (que por sua vez
nada mais do que um programa). A verso compilada do
programa tipicamente armazenada, de forma que o programa
pode ser executado um nmero indefinido de vezes sem que
seja necessria nova compilao, o que compensa o tempo gasto
na compilao. Isso acontece com linguagens como Pascal e C.

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

como o cdigo-fonte de um programa de computador) e


produzir uma seqncia de smbolos chamado "smbolos
lxicos" (lexical tokens), ou somente "smbolos" (tokens), que
podem ser manipulados mais facilmente por um parser (leitor
de sada).
! A Anlise Lxica a forma de verificar determinado alfabeto.

Quando analisamos uma palavra, podemos definir atravs da


anlise lxica se existe ou no algum caractere que no faz
parte do nosso alfabeto, ou um alfabeto inventado por ns. O
analisador lxico a primeira etapa de um compilador, logo
aps vir a anlise sinttica.

Anlise sinttica
! Tambm conhecida pelo termo em ingls parsing o processo de

analisar uma seqncia de entrada (lida de um arquivo de


computador ou do teclado, por exemplo) para determinar sua
estrutura gramatical segundo uma determinada gramtica formal.
Essa anlise faz parte de um compilador, junto com a anlise
lxica e anlise semntica.

! A anlise sinttica transforma um texto na entrada em uma

estrutura de dados, em geral uma rvore, o que conveniente


para processamento posterior e captura a hierarquia implcita
desta entrada. Atravs da anlise lxica obtido um grupo de
tokens, para que o analisador sinttico use um conjunto de regras
para construir uma rvore sinttica da estrutura.

! Em termos prticos, pode tambm ser usada para decompor um

texto em unidades estruturais para serem organizadas dentro de


um bloco, por exemplo.

Anlise semntica
! um sinnimo de Anlise sinttica e a terceira fase

da compilao onde se verifica os erros semnticos,


(por exemplo, uma multiplicao entre tipos de dados
diferentes) no cdigo fonte e coleta as informaes
necessrias para a prxima fase da compilao que a
gerao de cdigo objeto.

Gerador de Cdigo
! Dentro do diversificado leque de categorias de ferramentas que

prestam apoio s atividades da Engenharia de Software


(CASE), uma especfica vem ganhando cada vez mais destaque
e, sobre ela, tem-se aplicado muito investimento nos ltimos
tempos: as Ferramentas de Gerao de Cdigo, ou
simplesmente Geradores de Cdigo.
! Dessa forma, Gerador de Cdigo aquela ferramenta que

possui a capacidade de gerar cdigo a partir de um


determinado modelo de software. Inclusive, de acordo com
alguns pontos de vista e a partir das caractersticas especficas
do tipo de Gerador de Cdigo, ele passa a ser conversor de
cdigos de linguagens distintas. Isso acontece, por exemplo,
com o compilador, que transforma um cdigo escrito atravs
de uma linguagem de programao para cdigo de mquina ou
cdigo objeto.

Otimizao
! Em matemtica, o termo otimizao, ou programao

matemtica, refere-se ao estudo de problemas em que se busca


minimizar ou maximizar uma funo atravs da escolha sistemtica
dos valores de variveis reais ou inteiras dentro de um conjunto
vivel.
! A Otimizao de cdigo a estratgia de examinar o cdigo

intermedirio, produzido durante a fase de gerao de cdigo com


objetivo de produzir, atravs de algumas tcnicas, um cdigo que
execute com bastante eficincia. O nome otimizador deve sempre
ser encarado com cuidado, pois no se pode criar um programa
que leia um programa P e gere um programa P equivalente sendo
melhor possvel segundo o critrio adotado. Vrias tcnicas e vrias
tarefas se renem sob o nome de Otimizao. Estas tcnicas
consistem em detectar padres dentro do cdigo produzido e
substitu-los por cdigos mais eficientes

Gerao de cdigo intermedirio


! Ocorre a transformao da rvore sinttica em uma

representao intermediria do cdigo fonte. Um tipo


popular de linguagem intermediria conhecido como
cdigo de trs endereos. Neste tipo de cdigo uma
sentena tpica tem a forma X := A op B, onde X,A e B
so operandos e op uma operao qualquer. Uma forma
prtica de representar sentenas de trs endereos
atravs do uso de qudruplas (operador, argumento-1,
argumento-2 e resultado). Este esquema de
representao de cdigo intermedirio preferido por
diversos compiladores, principalmente aqueles que
executam extensivas otimizaes de cdigo, uma vez que
o cdigo intermedirio pode ser rearranjado de uma
maneira conveniente com facilidade.

Tcnica de Programao Linear


! Em matemtica, problemas de Programao Linear so problemas

de otimizao nos quais a funo objetivo e as restries so todas


lineares.
Programao Linear uma importante rea da otimizao por
vrias razes. Muitos problemas prticos em pesquisa operacional
podem ser expressos como problemas de programao linear.
Certos casos especiais de programao linear, tais como problemas
de network flow e problemas de multicommodity flow so
considerados importantes o suficiente para que se tenha gerado
muita pesquisa em algoritmos especializados para suas solues.
Vrios algoritmos para outros tipos de problemas de otimizao
funcionam resolvendo problemas de PL como sub-problemas.
Historicamente, idias da programao linear inspiraram muitos
dos conceitos centrais de teoria da otimizao, tais como
dualidade, decomposio, e a importncia da convexidade e suas
generalizaes.

Tcnica de Programao Modular


! Programao modular um paradigma de programao no qual o

desenvolvimento das rotinas de programao feito atravs de


mdulos, que so interligados entre si atravs de uma interface
comum.
Foi apresentado originalmente pela Information & Systems
Institute, Inc. no National Symposium on Modular Programming
em 1968, com a liderana de Larry Constantine.

Tcnica de Programao Estruturada


! Programao estruturada uma forma de programao de

computadores que preconiza que todos os programas possveis


podem ser reduzidos a apenas trs estruturas: sequncia, deciso
e iterao.
Tendo, na prtica, sido transformada na Programao modular, a
Programao estruturada orienta os programadores para a
criao de estruturas simples em seus programas, usando as subrotinas e as funes. Foi a forma dominante na criao de
software entre a programao linear e a programao orientada
por objetos.
Apesar de ter sido sucedida pela programao orientada por
objetos, pode-se dizer que a programao estruturada ainda
marcantemente influente, uma vez que grande parte das pessoas
ainda aprendem programao atravs dela. Porm, a orientao a
objetos superou o uso das linguagens estruturadas no mercado

Tcnica de Programao Orientada a Objeto


!

Programao Orientada a Objetos (POO) um paradigma de anlise, projeto e programao


de sistemas de software baseado na composio e interao entre diversas unidades de
software chamadas de objetos.

Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de


programao. De fato, o paradigma "orientao a objeto" tem bases conceituais e origem no
campo de estudo da cognio, que influenciou a rea de inteligncia artificial e da lingstica
no campo da abstrao de conceitos do mundo real. Na qualidade de mtodo de
modelagem, tida como a melhor estratgia, e mais natural, para se eliminar o "gap
semntico", dificuldade recorrente no processo de modelar o mundo real, no domnio do
problema, em um conjunto de componentes de software que seja o mais fiel na sua
representao deste domnio. Facilitaria a comunicao do profissional modelador e do
usurio da rea alvo, na medida em que a correlao da simbologia e conceitos abstratos do
mundo real e da ferramenta de modelagem (conceitos, terminologia, smbolos, grafismo e
estratgias) fosse a mais bvia, natural e exata possvel.

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

classificadas e sub-classificadas de vrias


formas.
! Classificao da ACM
! Quanto ao paradigma
! Quanto a estrutura de tipos
! Quanto ao grau de abstrao
! Quanto gerao

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

segundo o paradigma que seguem para abordar a sua


sintaxe:

! Linguagem funcional
! Linguagem natural
! Programao lgica
! Programao imperativa
! Programao estruturada
! Linguagem orientada a objetos

Quanto a estrutura de tipos


! Fracamente tipada, como Smalltalk, onde o tipo da varivel

muda dinamicamente conforme a situao.


! Fortemente tipada, como Java, Ruby, onde o tipo da varivel,

uma vez atribudo, se mantm o mesmo at ser descartada da


memria.
! Dinamicamente tipada, como Perl, Python ou Ruby, onde o

tipo da varivel definido em tempo de execuo.


! Estaticamente tipada, como Java e C, onde o tipo da varivel

definido em tempo de compilao.

Quanto ao grau de abstrao


! Linguagem de programao de baixo nvel, cujos smbolos so

uma representao direta do cdigo de mquina que ser


gerado, onde cada comando da linguagem equivale a um
"opcode" do processador, como Assembly.
! Linguagem de programao de mdio nvel, que possui

smbolos que podem ser convertidos diretamente para cdigo de


mquina (goto, expresses matemticas, atribuio de variveis),
mas tambm smbolos complexos que so convertidos por um
compilador. Exemplo: C, C++.
! Linguagem de programao de alto nvel, composta de

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

! Java, C++, linguagens de consulta SQL.

! Quinta gerao, linguagens lgicas


! Prolog.

C
C++
Objec0ve-
C

Modelo de execuo

Inuncias

Paradigma principal

Compilao

Algol, BCPL

Estruturada, Procedimental, Orientada por uxo

Compilao

C, Simula, Algol Principalmente orientada a objectos, ml0plos


paradigmas
68

Modelo de 0po
Introduo
de dados
Est0co, fraco Incio de 1970
Est0co, fraco

1979

Dinmico e
est0co, fraco

1986

Compilao

C, Smalltalk

Principalmente orientada a objectos, Reec0va,


Passagem de mensagens

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++

Orientada a objectos, ml0plos paradigmas

Est0co, forte

2002

Java

Interpretao e
Compilao

C++

Orientada a objectos

Est0co, forte

1996

Perl

Interpretao

C, Shell, awk, sed,


Lisp

Funcional, Orientada a objectos e Procedural

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

Estruturada, Procedimental, Orientada a objectos

Dinmico, forte

1999

Python
Ruby

Principais linguagens de programao


Linguagens histricas (2GL, 3GL)

ALGOL APL Assembly AWK B BASIC BCPL


COBOL CPL Forth Fortran Lisp Logo Simula
Smalltalk

Linguagens acadmicas

Gdel Haskell Icon Lisp Logo Lua Pascal


Prolog Scala Scheme Scratch Simula
Smalltalk Tcl

Linguagens proprietrias

ABAP Ac0onScript AWK COBOL Delphi Eiel


MATLAB PL/SQL PowerShell Scratch Visual
Basic

Linguagens no-proprietrias

Ada Assembly C C++ C# Icon Lisp Logo


Object Pascal Objec0ve-C Pascal Scheme
Simula Smalltalk

Linguagens livres

Boo D Erlang Go Groovy Harbour Haskell


Java JavaScript Lua Perl PHP Python Ruby
Scala Tcl

Linguagens esotricas

Befunge brainfuck FALSE INTERCAL LOLCODE


Malbolge PATH Pbrain SNUSP Unlambda
Whitespace

O que o cdigo abaixo faz?

#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

public class NewClass {


public static void main(String args[]) {
int x = 10, y = x + 1;
int sequencia[] = new int[y];
sequencia[0] = 0;
sequencia[1] = 1;
System.out.print("\nSequencia:\n" + sequencia[0] + ", "
+ sequencia[1] + ", ");
for (int i = 2; i < sequencia.length; i++) {
sequencia[i] = sequencia[i - 1] + sequencia[i - 2];
if (i == (sequencia.length - 1)) {
System.out.print(" " + sequencia[i]);
} else {

public class Fibonacci {


public static int calcular(int n) {
if (n == 0 || n == 1)
return n;
else
return calcular(n - 1) + calcular(n - 2);
}
}
public class Main {
public static void main(String[] args) {
Fibonacci f = new Fibonacci();
for (int x = 1; x < 10; x++) {

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 Recursivo em Scheme


(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1)) (fib (- n 2))))))

Algoritmo Iterativo em Scheme


(define (fib n)
(define (iter i p r)
(if (= i n)
r
(iter (+ i 1) r (+ p r))))
(cond ((= n 0) 0)
((= n 1) 1)
(else (iter 2 1 1))))

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));
}

Algoritmo recursivo em Python


def fibo(n):
if n < 2:
return n
else:
return fibo(n-1) + fibo(n-2)
for i in range(10):
print fibo(i)

Algoritmo eficiente em Python


def fib(n):
c, n1, n2 = 0, 0, 1
while c < n:
yield n1
n1, n2 = n2, n1 + n2
c += 1
# Calcular os 10 primeiros termos
for x in fib(10):
print x

<?php

Algoritmo em PHP

/*Algoritmo Recursivo da Sequncia Fibonacci */


function fibonacci($i) {
return $i < 2 ? $i : fibonacci($i-1) + fibonacci($i-2);
} /* Chamando */
for($i=1;$i<10;$i++) {
echo fibonacci($i)."\r\n"; }
?>

Algoritmo em PHP Bem Mais Rpido

<?php

function fibonacci ($number=10, $returnLast = false) {


$start = array();
$start[1] = 1;
$start[2] = 1;
if ( $number == 1 ) {
unset($start[2]);
}
for ( $i = 3; $i <= $number; $i ++ ) {
array_push($start, $start[$i - 2] + $start[$i - 1]);
}
return $returnLast === true ? end($start) : $start;
} /* Para utilizar */
echo "<pre>";

Algoritmo em Perl
# !/usr/bin/perl
use strict;
sub fibo {

return $_[0] < 2 ? $_[0] : fibo($_[0]-1) + fibo($_[0]-2);


}
for (1..10){
print fibo($_)."\n";
}

Algoritmo em Perl Mais Eficiente


# !/usr/bin/perl
use strict;
my ($a,$b)=(1,2);
print "$a\n$b\n";
for(1..100) {
($a,$b) = ($b,$a+$b);
print "$b\n
}

#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 C Outro Mtodo


#include <stdio.h>
#include <stdlib.h>
int main() {
int n_anterior1=1,n_anterior2=0,n=1;
for(int i = 1;i<=15;i++){
printf("%d ",n);
n = n_anterior1 + n_anterior2;
n_anterior2=n_anterior1;
n_anterior1=n;
}
printf("\n");
system("PAUSE");
return 0;

Algoritmo em Ruby

# Algoritmo Recursivo da Sequncia Fibonacci


def fib(n)
return n if n<2
fib(n-1)+fib(n-2)
end
# Chamando
for i in (1..10)
puts fib(i)
end
# Ou com memorizao

fib = Hash.new{|hash, n| hash[n] = (n < 2) ? n : hash[n - 1] + hash[n - 2];};


(1..100).each do |i|
puts fib[i]

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 Shell Script


fibonacci() {
local a c
local -F1 b
a=0 ; b=1
print $a
repeat $1
do
print "${b%.*}"
c=$a
a=$b
((b = c + b))
done
}

Algoritmo em bc (comando Unix)


define void fibonacci(valor)
{
auto x, y, z, i;
x = 0;
y = 1;
x;
while (i++ < valor) {
y;
z = x;
x = y;
y = z + y;
}

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;

Algoritmo em Prompt Script (BAT)

@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

escreval(" digite novamente [pressione enter]")

n0,n1,n2:inteiro

leia(aux)

I:inteiro

limpatela

soma:inteiro

fimse

aux: caracter

fimenquanto

inicio

escreva("1 numero da seq.: ")

n0:=0

leia(n1)

enquanto n0<2 faca

escreva("2 numero da seq.: ")

escreva("quantos num.? [ n > 1 ]:")

leia(n2)

leia(n0)

escreva(" ",n1," ",n2," ")


soma:=n1+n2

*----------------------

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.

Algoritmo em Visual Fox Pro

? Fibonacci(22)

FUNCTION Fibonacci (tnNumeros)


LOCAL lnNumero, lnNumero1, lnNumero2, lnI, lcRetorno
lnI = 1
lcRetorno = ""
lnNumero = 1
lnNumero1 = 1
lnNumero2 = 0
FOR lnI = 1 TO tnNumeros STEP 1
lcRetorno = lcRetorno + " " + TRANSFORM(lnNumero)
lnNumero = lnNumero1 + lnNumero2
lnNumero2 = lnNumero1
lnNumero1 = lnNumero
ENDFOR

Algoritmo em C#

public String Fibonacci(int numeros)


{
String retorno = "";
int numero = 1;
int numero1 = 1;
int numero2 = 0;
for(int i=0; i < numeros; i++)
{

retorno = retorno + " " + numero.ToString();


numero = numero1 + numero2;
numero2 = numero1;
numero1 = numero;
}

Algoritmo em C# (modo com caixa de texto)


public void fibonacci(object s, EventArgs e){
int x;
try{
x = int.Parse(xfb.Text);
int r = 0, n1 = 1, n2 = 1, nn = 0;
for (int i = 0; i < x; i++){
r = n1;
n1 = n2 + nn;
nn = n2;
n2 = n1;
}
rfb.Text = r.ToString();
if (x > 46){

#include <iostream>

Algoritmo em C++

using namespace std;


int Fibonacci(int);
int main(){
int quantidade;
cout << "Deseja imprimir quantos numeros?";
cin >> quantidade;
for(int x = 1; x < quantidade; x++)
cout << "O " << x << "# numero de Fibonacci : " << Fibonacci(x) << "\n";
}
int Fibonacci(int Number){
if(number == 0 || number == 1)
return number;

Algoritmo em Fortran 2003

PROGRAM FIBONACCI
IMPLICIT NONE

INTEGER, DIMENSION (1:1000) :: FIB


INTEGER :: I,N
WRITE(*,*) "SEQUENCIA DE FIBONACCI COM N ELEMENTOS. INFORME N"
READ (*,*) N
FIB(1) = 1
FIB(2) = 1
WRITE(*,*) !pular linha
WRITE(*,*) FIB(1)
WRITE(*,*) FIB(2)
DO I = 3,N
FIB(I) = FIB(I-1) + FIB(I-2)
WRITE(*,*) FIB(I)

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

linguagem desses slides usa por padro.


! Tente fazer ou buscar algoritmos em cada linguagem

mostrada nos programas de Fibonacci para o problema


fatorial e nmeros primos.
! Que implementao voc indicaria para cada

problema? Qual o paradigma melhor para cada


problema? Por que?

Você também pode gostar