SlideShare uma empresa Scribd logo
Tutoria AEDSI
Pablo Silva
Recursividade
Muitos algoritmos têm a seguinte propriedade:
cada instância do problema contém uma instância
menor do mesmo problema. Dizemos que esses
problemas têm estrutura recursiva, porque é
possível resolver o problema chamando à si mesmo
com uma instância menor do problema.
Recursividade
Uma função que chama à si mesmo é dita recursiva.
Funções que chamam outras funções
Esse conceito tem que ficar bem claro: Uma função
pode chamar uma outra ou mais funções. Vamos ver
um exemplo.
Calcular a mesada
Suponha que queremos um programa para calcular a mesada de nossos filhos, baseado
em suas idades e notas. Seja então a seguinte função calcMesada. Não se preocupem
com a main, ela logo aparecerá. Não precisamos criar a main primeiro sempre, mas ela
terá que ser criada em algum momento!
O que esta função faz é receber um
parâmetro que será a idade do nosso
filho e retorna um valor maior da
mesada para filhos maiores de idade.
Calcular a mesada
Digamos agora que, a mesada de nossos filhos menores de idade, tem que ser recompensada (ou não!)
por suas notas. Então criamos a seguinte função que dá um bônus ou um desconto (bd) para nosso filho
menor de idade.
Essa função recebe três
parâmetros: a idade, a nota e o
valor da mesada já calculada
pela função anterior. Por isso é
muito importante chamar as
funções na ordem em que
queremos os resultados. Se não
calcularmos a mesada antes com
a outra função, como vamos
passa-la como parâmetro aqui!?Se a idade do nosso filho for menor que 18, vamos variar a mesada de
acordo com a nota dele, senão, vamos somente retornar o mesmo valor
da mesada que passamos para a função.
Calcular a mesada
Na main, vamos receber o
valor da idade e a nota
através da função scanf
(permite que o usuário
digite valores e armazena
nas variáveis passada como
parâmetro).
Após isso, chamamos a
função calcMesada para
calcular a mesada e
atribuímos este valor a
variável mesada.
Agora vamos chamar a
nossa segunda função e
passando como parâmetro
a própria mesada obtida
anteriormente.
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 1: variável mesada é criada
sem valor algum por enquanto.
mesada
&43jjuiop
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 2: variável idade é criada sem
valor algum por enquanto.
mesada
&43jjuiop
idade
&4399uiop
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 3: variável nota é criada sem
valor algum por enquanto.
mesada
&43jjuiop
idade
&4399uiop
nota
&43666iop
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 4: mensagem exibida na tela:
Entre com a idade do seu filho:
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 5: o usuário digita um valor para idade
e esse valor vai para a variável idade.
Entre com a idade do seu filho: 10
10
idade
&4399uiop
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 6: mensagem é exibida na tela
Entre com a idade do seu filho: 10
Entre com a nota geral do seu filho:
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Passo 7: o usuário entra com o valor da nota
e esse valor vai direto para a variável nota.
Entre com a idade do seu filho: 10
Entre com a nota geral do seu filho: 1
1
nota
&43666iop
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
8
?
?
?
Vamos para a função!
A seta está para cima porque
uma função que é chamada por
outra função sempre deve ser
declarada acima da função que à
está chamando. Do contrário, a
função não conseguirá chama-
la!
10
Estamos passando o valor
da idade e não uma
referência. Por isso nossa
caixinha só tem um valor
e nada de referências para
a variável idade.
(Recebemos este valor
anteriormente!)
Vamos executar este programa
int calcMesada(int idade){
if(idade < 18)
return idade*20;
else {
return idade*50;
}
}
Passo 9: Uma nova caixinha (varíavel)
chamada idade é criada e o valor que
“jogamos” (passamos como parâmetro na
chamada da função) para a função é
colocado lá dentro.
10
9
10
11
12
13
14
10
idade
&9999uiop
Muito importante entender aqui
que essa caixinha tem o mesmo
nome que a caixinha da idade que
está na main. Mas como pode ser
visto os endereços são diferentes.
ELAS NÃO SÃO A MESMA VARIÁVEL,
SOMENTE TEM O MESMO NOME.
Já sabemos que não podemos ter
duas variáveis com o mesmo nome,
mas esta regra é válida para
mesmas funções. Funções
diferentes podem ter variáveis com
mesmo nome, que é o nosso caso!
Lembre-se, uma função não consegue ver
nada que está dentro de outra função. O
escopo de uma função é digamos
“secreto” para todas as outras!
Vamos executar este programa
int calcMesada(int idade){
if(idade < 18)
return idade*20;
else {
return idade*50;
}
}
Passo 10: Verificamos se a idade é menor
que 18. Para este nosso caso ela é, então o
passo 11 será executado!
9
10
11
12
13
14
10
idade
&9999uiop
Lembre-se, uma função não consegue ver
nada que está dentro de outra função. O
escopo de uma função é digamos
“secreto” para todas as outras!
Vamos executar este programa
int calcMesada(int idade){
if(idade < 18)
return idade*20;
else {
return idade*50;
}
}
Passo 11: Encontramos a palavra return.
Portanto neste momento vamos retornar o
valor da multiplicação de idade por 20 para o
local onde esta função foi chamada. Neste
caso é a na main.9
10
11
12
13
10
idade
&9999uiop
Importante: os passos 12, 13 nunca serão
executados, pois uma vez que em uma
função, é encontrado a palavra de retorno, ela
imediatamente interrompe sua execução e
retorna o valor passado para o return.
200
Só podemos retornar valores que já temos. Por
isso, o retorno para a main só vai acontecer
quando o computador processar a operação
idade*20 e substituir o valor desta multiplicação
na expressão. Se o computador demorasse 10
anos para computar esta multiplicação, então
demoraríamos 10 anos para voltar para a main!
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
812
?
?
Passo 12: a caixinha de
mesada recebe o valor de
retorno da função.
13
200
mesada
&43jjuiop
200
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
812
?
?
Passo 13: vamos novamente para outra
função. Chamamos bdMesada enviando os
valores dos nossos três parâmetros!
(Passagem por valor!)
13
200
mesada
&43jjuiop
10
idade
&4399uiop
1
nota
&43666iop
10
1
200
Vamos executar este programa
int bdMesada(int idade, int notas, int mesada){
if(idade < 18)
return mesada*notas;
return mesada;
}
Passo 14: São criadas novas caixinhas para os
nossos parâmetros que vão receber os
valores enviados na chamada da função, na
mesma ordem enviada.
14
15
16
17
Lembre-se, uma função não consegue ver
nada que está dentro de outra função. O
escopo de uma função é digamos
“secreto” para todas as outras!
200
mesada
&99yjuiop
10
idade
&4oouiop
1
nota
&4wertiop
MESMOS NOMES, MAS
ENDEREÇOS DIFERENTES!
10 1 200
Vamos executar este programa
int bdMesada(int idade, int notas, int mesada){
if(idade < 18)
return mesada*notas;
return mesada;
}
Passo 15: Vamos ver se a idade é menor que
18. Para o nosso caso é, então vamos
executar o passo 16.
14
15
16
17
Lembre-se, uma função não consegue ver
nada que está dentro de outra função. O
escopo de uma função é digamos
“secreto” para todas as outras!
200
mesada
&99yjuiop
10
idade
&4oouiop
1
nota
&4wertiop
MESMOS NOMES, MAS
ENDEREÇOS DIFERENTES!
Vamos executar este programa
int bdMesada(int idade, int notas, int mesada){
if(idade < 18)
return mesada*notas;
return mesada;
}
Passo 16: Encontramos a palavra return e
então vamos retornar para o local que esta
função foi chamada, retornando o valor de
mesada*notas que para nosso caso é 200*1
= 200. O passo 17 então não será executado,
pois interrompemos a execução no
momento do retorno.
14
15
16
17
Lembre-se, uma função não consegue ver
nada que está dentro de outra função. O
escopo de uma função é digamos
“secreto” para todas as outras!
200
mesada
&99yjuiop
10
idade
&4oouiop
1
nota
&4wertiop
200
Novamente, retornamos
valores e nunca expressões!
Para que a função retorne para
onde foi chamada, o
computador primeiro tem que
fazer a multiplicação e devolver
um valor para o retorno!
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
812
15
16
Passo 14: a caixinha da mesada, vai receber
o valor de retorno da função. Como já
tínhamos um valor lá, ele será substituído
pelo novo. Coincidentemente, este valor é o
mesmo, porque nossa multiplicação na
função foi por 1. De qualquer maneira o
valor será substituído, mesmo que seja pelo
mesmo valor!
13
10
idade
&4399ui
1
nota
&43666iop
14
200
200
mesada
&43jjuiop
200
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
812
15
16
Passo 15: É exibida uma mensagem na tela com o valor
da variável mesada, que é a saída final do nosso
programa e o objetivo que queríamos atingir.
1314
200
Entre com a idade do seu filho: 10
Entre com a nota geral do seu filho: 1
O valor da mesada para seu filho e: 200.
Vamos executar este programa
int main(){
int mesada;
int idade;
int nota;
printf("Entre com a idade do seu filho:");
scanf("%d", &idade);
printf("Entre com a nota geral do seu filho:");
scanf("%d", &nota);
mesada = calcMesada(idade);
mesada = bdMesada(idade,nota,mesada);
printf("nnO valor da mesada para seu filho e: %d", mesada);
return 0;
}
1
2
3
4
5
6
7
812
15
16
Passo 16: Programa termina. É exibida na tela uma
mensagem padrão da linguagem.
1314
200 Entre com a idade do seu filho: 10
Entre com a nota geral do seu filho: 1
O valor da mesada para seu filho e: 200.
Program returned with execution of
0.2222s
Recursividade
Como já vimos que uma função pode chamar uma
ou mais funções, então não há porque duvidar que
uma função pode chamar à ela mesma! Vamos ver
como funciona então uma função recursiva.
Vamos ver um exemplo
int main(){
exemplo(‘c’);
return 0;
}
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
Digamos que temos a função exemplo e chamamos ela na main passando o caracter ‘c’. Vamos ver como
será a execução.
1
2
3
4
5 ?
Vamos ver um exemplo
int main(){
exemplo(‘c’);
return 0;
}
1
2
?
Passo 1: o programa se inicia.
Vamos ver um exemplo
int main(){
exemplo(‘c’);
return 0;
}
1
2
?
Passo 2: vamos para a função e estamos
passando o caracter ‘c’ utilizando passagem
por valor. Dessa vez nem mesmo temos
variáveis na main. Só estamos querendo
chamar a função para ver o qual é seu
comportamento recursivo.
c
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 3: Uma variável (caixinha) do tipo
char é criada e o valor passado na
chamada da função é atribuído à ela.
c
c
a
&3399uiop
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 4: Imprimimos o caracter que está
na variável a na tela.
c
a
&3399uiop
c
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 5: O passo cinco é chamado passo
recursivo, que é quando chamamos a
mesma função dentro dela. Veja, estamos
passando a variável a por valor. Logo,
vamos jogar novamente a letra c para a
função.
c
a
&3399uiop
c
Muito importante lembrar que,
quando uma função termina o seu
escopo, tudo que está dentro dela
é destruído. Portanto a caixinha a
será destruída e recriada,
possivelmente em um novo
endereço.
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 3: Uma nova caixinha (variável) de
nome a será criada e armazenará o valor
que passamos na chamada da função.
c
a
&3633uiop
c
Provavelmente esta nova
caixinha terá um novo
endereço. A memória é
bastante aleatória.
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 4: Imprimimos novamente a letra c
na tela.
cc
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 5: Chamamos novamente a nossa
função. Outro passo recursivo. E tudo
recomeça outra vez.
c
a
&3633uiop
c
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 3: Uma nova caixinha (variável) de
nome a será criada e armazenará o valor
que passamos na chamada da função.
c
a
&456guiop
c
Provavelmente esta nova
caixinha terá um novo
endereço. A memória é
bastante aleatória.
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 4: Imprimimos novamente a letra c
na tela.
ccc
Vamos ver um exemplo
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
3
4
5
Passo 5: Chamamos novamente a nossa
função. Outro passo recursivo. E tudo
recomeça outra vez.
c
a
&3633uiop
c
Recursividade
CHEGAAAAAA! UFF! Como fazer a recursão parar?
Pois é, esta é outra característica de uma função
recursiva. Ela precisa sempre ter um Caso Base, que
vai determinar quando ela vai parar de se chamar.
Caso base
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
Para esta função, nem conseguiríamos criar um
caso base sem que tivéssemos mais um
parâmetro, que frequentemente é o contador dos
passos recursivos. Esse contador sempre é
diminuído por um fator qualquer (depende do
nosso problema) até que ele encontre um caso
base.
Esta característica torna a recursão, uma
resolução de problemas por instâncias menores
do mesmo problema.
A cada passo recursivo, o nosso problema
diminui, até que cheguemos no caso base, que
será a menor instância do nosso problema.
Caso base
void exemplo(char a){
printf(“%c”, a);
exemplo(a);
}
É muito importante
modelar a função recursiva
de maneira correta, pois
senão, como vimos, nosso
programa pode entrar em
loop e nunca parar!
Funções recursivas
Vamos ver um exemplo prático agora. Seja o fatorial matemático
definido por n!:
1! = 1
2! = 2*1 = 2*1!
3! = 3*2*1 = 3*2!
4! = 4*3*2*1 = 4*3!
5! = 5*4*3*2*1 = 5*4!
.....................................
n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)!
Para criar uma função recursiva que
resolva este problema, precisamos
encontrar dois elementos essenciais
para a recursão:
1) Caso base
2) Passo recursivo
Funções recursivas
Vamos ver um exemplo prático agora. Seja o fatorial matemático
definido por n!:
1! = 1
2! = 2*1 = 2*1!
3! = 3*2*1 = 3*2!
4! = 4*3*2*1 = 4*3!
5! = 5*4*3*2*1 = 5*4!
.....................................
n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)!
O caso base é muito simples, e
logicamente que é 1. Se olharmos para
todas as linhas, elas sempre terminam
no 1 e por isso ele é o nosso caso base.
Pense no caso base, como o elemento
que sempre vai ser atingindo em algum
momento e ele deve ser, pois do
contrário como vamos parar a recursão?
Funções recursivas
Vamos ver um exemplo prático agora. Seja o fatorial matemático
definido por n!:
1! = 1
2! = 2*1 = 2*1!
3! = 3*2*1 = 3*2!
4! = 4*3*2*1 = 4*3!
5! = 5*4*3*2*1 = 5*4!
.....................................
n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)!
O passo recursivo é aquele em que
diminuímos a instância do nosso
problema por algum fator. Para o nosso
caso ele é dado pela nossa fórmula geral:
n*(n-1)!
Vamos entender o por que.
Funções recursivas
Vamos ver um exemplo prático agora. Seja o fatorial matemático
definido por n!:
1! = 1
2! = 2*1 = 2*1!
3! = 3*2*1 = 3*2!
4! = 4*3*2*1 = 4*3!
5! = 5*4*3*2*1 = 5*4!
.....................................
n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)!
n*(n-1)! nos diz o seguinte:
Multiplique a instância do meu problema de
valor n por uma nova instância de valor n-1.
Para encontrarmos o valor da instância n-1
vamos ter que realizar novamente o fatorial.
Percebe que utilizamos o fatorial novamente
para calcular (n-1)!. Com certeza este é o nosso
passo recursivo, pois a cada chamada, vamos
diminuir a instância do nosso problema por um
fator de 1.
Funções recursivas
Nossa função então ficaria da seguinte maneira:
int fatorial(int n){
}
A função tem que
retornar um inteiro, pois é
o valor do fatorial que
queremos encontrar!
Funções recursivas
Nossa função então ficaria da seguinte maneira:
int fatorial(int n){
if( n == 1 )
return 1;
}
Sempre numa função recursiva,
a primeira coisa a fazer é
colocar o caso base. Sabemos
que o fatorial de 1 é 1 e então
este será o nosso valor de
retorno.
Funções recursivas
Nossa função então ficaria da seguinte maneira:
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
Agora então definimos nosso
passo recursivo, dado pela
fórmula geral. O passo recursivo
é exatamente a nossa fórmula
geral, porém escrito na
linguagem de programação e
não numa fórmula matemática.
E nossa função recursiva está
pronta! Vamos testá-la.
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
3
1
2
3
4
Passo 1: uma caixinha para n é
criada e o valor 3 colocado lá
dentro.
3
n
&3633uiop
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
1
2
3
4
Passo 2: verificamos se atingimos
nosso caso base. Como n não é
igual a 1, ainda não o atingimos.
Pulamos então para o passo 4.
3
n
&3633uiop
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
1
2
3
4
Passo 4: Passo recursivo. Vamos
chamar nossa função novamente
passando um novo valor de n.
3
n
&3633uiop
2
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
5
6
7
8
Passo 5: Uma nova caixinha para n
é criada e o valor de chamada é
atribuído à ela.
2
n
&2223uiop
2
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
5
6
7
8
Passo 6: Verificamos novamente o
nosso caso base. Ainda não o
atingimos, e então o passo 7 será
pulado.
2
n
&2223uiop
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
5
6
7
8
Passo 8: Uma nova chamada
recursiva é realizada com uma
instância ainda menor do
problema.
2
n
&2223uiop
1
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
9
10
11
12
Passo 9: Novamente uma nova
caixinha para n é criada, e o valor
passado na chamada é atribuído
para ela.
1
n
&9923uiop
1
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
9
10
11
12
Passo 10: Verificamos o nosso caso
base e percebemos que acabamos
de atingí-lo! Então o passo 12 não
será executado.
1
n
&9923uiop
1
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
9
10
11
12
Passo 11: Mas e agora,
encontramos a palavra
return, para onde temos
que retornar? Para a
main?
1
n
&9923uiop
Recursividade
Entender para onde voltar quando atingimos o caso
base é essencial para conseguirmos entender o que
é recursividade. Vamos ver uma mapa desta
execução.
Recursividade
Na primeira chamada tínhamos o seguinte passo
recursivo:
1) 3 * fatorial(3-1)
Recursividade
Na segunda chamada:
1) 3 * fatorial(3-1)
2) 2 * fatorial(2-1)
Recursividade
Na terceira chamada:
1) return 3 * fatorial(3-1)
2) return 2 * fatorial(2-1)
3) return 1
A terceira chamada foi onde encontramos o nosso
caso base. Dessa maneira, o valor de retorno da
chamada em que o caso base é encontrado deve ser
retornado para exatamente a última chamada
efetuada antes do caso base.
Perceba que todas as chamadas são também
retornos e mais uma vez, um retorno só pode conter
valores já definidos. O que acontece nas chamadas 2
e 3, é que elas estão esperando valores de retorno
para poderem realizar a multiplicação. Já na chamada
3 não, 1 já é um valor definido e não tem que realizar
nenhuma operação.
Recursividade
Logo:
1) return 3 * fatorial(3-1)
2) return 2 * fatorial(2-1)
3) return 1
1
Recursividade
Logo:
1) return 3 * fatorial(3-1)
2) return 2 *
3) return 1
1
Agora a chamada 2 pode realizar a
multiplicação e retornar seu valor
para a chamada 1.
Recursividade
Logo:
1) return 3 * fatorial(3-1)
2) return 2
3) return 1
2
Recursividade
Logo:
1) return 3 *
2) return 2
3) return 1
2
Por fim, a chamada 3 pode realizar
também a multiplicação e retornar
para onde foi chamada. Como vimos
no começo, assumimos que chamamos
a função fatorial na main e então é pra
lá que o retorno da primeira chamada
irá voltar, devolvendo enfim o valor do
fatorial de 3 que é 6!
Recursividade
Logo:
1) return 6
2) return 2
3) return 1
6
Assim se encerra a nossa função
recursiva!
Finalizando a execução
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
9
10
11
12
1
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
5
6
7
8
2
Funções recursivas
Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada.
int fatorial(int n){
if( n == 1 )
return 1;
return n * fatorial(n-1);
}
1
2
3
4
2
6
Voltando pra main com 6!
Funções recursivas
Escreva uma função recursiva que retorne o valor de um número elevado por n.
Exemplo:
exp(4,2) -> significa que queremos elevar 4 ao quadrado.
Quem fizer este exercício e me explicar na sala, poderá errar um exercício no
mini-teste.

Mais conteúdo relacionado

Destaque

Conceitos básicos de AEDS
Conceitos básicos de AEDSConceitos básicos de AEDS
Conceitos básicos de AEDS
Pablo Silva
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiro
Juan Basso
 
Apostila cobol
Apostila cobolApostila cobol
Apostila cobol
lucioandrade
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
Rangel Javier
 
Linguagem C - Uniões
Linguagem C - UniõesLinguagem C - Uniões
Linguagem C - Uniões
Elaine Cecília Gatto
 
CakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloCakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro bolo
elliando dias
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápido
Ivan Rosolen
 
Linguagem C - Estruturas
Linguagem C - EstruturasLinguagem C - Estruturas
Linguagem C - Estruturas
Elaine Cecília Gatto
 
Relações de recorrência
Relações de recorrênciaRelações de recorrência
Relações de recorrência
Pablo Silva
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
Felipe Ribeiro
 
Trabalho cobol e basic
Trabalho cobol e basicTrabalho cobol e basic
Trabalho cobol e basic
Daniel Carrara
 
Análise da complexidade de algoritmos
Análise da complexidade de algoritmosAnálise da complexidade de algoritmos
Análise da complexidade de algoritmos
Pablo Silva
 
Pilha dinâmica
Pilha dinâmicaPilha dinâmica
Pilha dinâmica
Elaine Cecília Gatto
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
Elaine Cecília Gatto
 
LIVROPROPRIETÁRIO-ALGORITMOS
LIVROPROPRIETÁRIO-ALGORITMOSLIVROPROPRIETÁRIO-ALGORITMOS
LIVROPROPRIETÁRIO-ALGORITMOS
Os Fantasmas !
 
Algoritmos em c #1
Algoritmos em c #1Algoritmos em c #1
Algoritmos em c #1
Stark2009
 
Desenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosDesenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetos
Lucas Vegi
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
Elaine Cecília Gatto
 
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoPHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
Rafael Jaques
 

Destaque (19)

Conceitos básicos de AEDS
Conceitos básicos de AEDSConceitos básicos de AEDS
Conceitos básicos de AEDS
 
CakePHP com sotaque brasileiro
CakePHP com sotaque brasileiroCakePHP com sotaque brasileiro
CakePHP com sotaque brasileiro
 
Apostila cobol
Apostila cobolApostila cobol
Apostila cobol
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 
Linguagem C - Uniões
Linguagem C - UniõesLinguagem C - Uniões
Linguagem C - Uniões
 
CakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro boloCakePHP - Aprendendo a fazer o primeiro bolo
CakePHP - Aprendendo a fazer o primeiro bolo
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápido
 
Linguagem C - Estruturas
Linguagem C - EstruturasLinguagem C - Estruturas
Linguagem C - Estruturas
 
Relações de recorrência
Relações de recorrênciaRelações de recorrência
Relações de recorrência
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Trabalho cobol e basic
Trabalho cobol e basicTrabalho cobol e basic
Trabalho cobol e basic
 
Análise da complexidade de algoritmos
Análise da complexidade de algoritmosAnálise da complexidade de algoritmos
Análise da complexidade de algoritmos
 
Pilha dinâmica
Pilha dinâmicaPilha dinâmica
Pilha dinâmica
 
Linguagem C - Vetores
Linguagem C - VetoresLinguagem C - Vetores
Linguagem C - Vetores
 
LIVROPROPRIETÁRIO-ALGORITMOS
LIVROPROPRIETÁRIO-ALGORITMOSLIVROPROPRIETÁRIO-ALGORITMOS
LIVROPROPRIETÁRIO-ALGORITMOS
 
Algoritmos em c #1
Algoritmos em c #1Algoritmos em c #1
Algoritmos em c #1
 
Desenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetosDesenvolvimento web: PHP orientado a objetos
Desenvolvimento web: PHP orientado a objetos
 
Linguagem C - Ponteiros
Linguagem C - PonteirosLinguagem C - Ponteiros
Linguagem C - Ponteiros
 
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de ComandoPHP na Tela Escura: Aplicações Poderosas em Linha de Comando
PHP na Tela Escura: Aplicações Poderosas em Linha de Comando
 

Semelhante a Recursividade

Exemplos registros e funções
Exemplos registros e funçõesExemplos registros e funções
Exemplos registros e funções
Carla Lee
 
Modulo02
Modulo02Modulo02
Modulo02
Lisandro Michel
 
Aula 3 - 06/04/11
Aula 3 - 06/04/11Aula 3 - 06/04/11
Aula 3 - 06/04/11
jeffersoncostta
 
Aula 3 algoritmos
Aula 3   algoritmosAula 3   algoritmos
Aula 3 algoritmos
Patrick_turma10
 
Javascript Recuperando Dados De Formularios
Javascript    Recuperando Dados De FormulariosJavascript    Recuperando Dados De Formularios
Javascript Recuperando Dados De Formularios
guestd9e271
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
Michel Ribeiro
 
Aula01
Aula01Aula01
Aula01
vdlos
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
Eduardo Bregaida
 
Repetições e vetores
Repetições e vetoresRepetições e vetores
Repetições e vetores
Thiago Luis Colozio Casácio
 
Lista c
Lista cLista c
Funçoes e procedimentos pascal
Funçoes e procedimentos pascalFunçoes e procedimentos pascal
Funçoes e procedimentos pascal
Marcus Vinicius
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
diogoa21
 
Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1
Isaac Barros
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02
julyesersantos
 
Atps de matematica aplicada
Atps de matematica aplicadaAtps de matematica aplicada
Atps de matematica aplicada
Ricardo Dutra Dutra
 
Exercícios Algoritmos
Exercícios AlgoritmosExercícios Algoritmos
Exercícios Algoritmos
Ana Cristina Aparecida
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
Claudia Ferlin
 
01 strategy
01 strategy01 strategy
Algoritmos-SlidesA1_2016_03_01.ppt
Algoritmos-SlidesA1_2016_03_01.pptAlgoritmos-SlidesA1_2016_03_01.ppt
Algoritmos-SlidesA1_2016_03_01.ppt
RobertoPereiradePaiv
 
Como criar uma calculadora no Game Maker 8.0 (GML Console)
Como criar uma calculadora no Game Maker 8.0 (GML Console)Como criar uma calculadora no Game Maker 8.0 (GML Console)
Como criar uma calculadora no Game Maker 8.0 (GML Console)
Rodrigo Cavalcante
 

Semelhante a Recursividade (20)

Exemplos registros e funções
Exemplos registros e funçõesExemplos registros e funções
Exemplos registros e funções
 
Modulo02
Modulo02Modulo02
Modulo02
 
Aula 3 - 06/04/11
Aula 3 - 06/04/11Aula 3 - 06/04/11
Aula 3 - 06/04/11
 
Aula 3 algoritmos
Aula 3   algoritmosAula 3   algoritmos
Aula 3 algoritmos
 
Javascript Recuperando Dados De Formularios
Javascript    Recuperando Dados De FormulariosJavascript    Recuperando Dados De Formularios
Javascript Recuperando Dados De Formularios
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Aula01
Aula01Aula01
Aula01
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Repetições e vetores
Repetições e vetoresRepetições e vetores
Repetições e vetores
 
Lista c
Lista cLista c
Lista c
 
Funçoes e procedimentos pascal
Funçoes e procedimentos pascalFunçoes e procedimentos pascal
Funçoes e procedimentos pascal
 
mod3-programação-estruturada
mod3-programação-estruturadamod3-programação-estruturada
mod3-programação-estruturada
 
Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1Aula 12 funcoes - Programação 1
Aula 12 funcoes - Programação 1
 
Exercícios java 20 02
Exercícios java 20   02Exercícios java 20   02
Exercícios java 20 02
 
Atps de matematica aplicada
Atps de matematica aplicadaAtps de matematica aplicada
Atps de matematica aplicada
 
Exercícios Algoritmos
Exercícios AlgoritmosExercícios Algoritmos
Exercícios Algoritmos
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
01 strategy
01 strategy01 strategy
01 strategy
 
Algoritmos-SlidesA1_2016_03_01.ppt
Algoritmos-SlidesA1_2016_03_01.pptAlgoritmos-SlidesA1_2016_03_01.ppt
Algoritmos-SlidesA1_2016_03_01.ppt
 
Como criar uma calculadora no Game Maker 8.0 (GML Console)
Como criar uma calculadora no Game Maker 8.0 (GML Console)Como criar uma calculadora no Game Maker 8.0 (GML Console)
Como criar uma calculadora no Game Maker 8.0 (GML Console)
 

Mais de Pablo Silva

Agilidade, times e outras coisas mais
Agilidade, times e outras coisas maisAgilidade, times e outras coisas mais
Agilidade, times e outras coisas mais
Pablo Silva
 
Times de produto de alta performance
Times de produto de alta performanceTimes de produto de alta performance
Times de produto de alta performance
Pablo Silva
 
Times de produto de alta performance
Times de produto de alta performanceTimes de produto de alta performance
Times de produto de alta performance
Pablo Silva
 
Transformação Digital: Criando uma empresa financeiramente estratégica para o...
Transformação Digital: Criando uma empresa financeiramente estratégica para o...Transformação Digital: Criando uma empresa financeiramente estratégica para o...
Transformação Digital: Criando uma empresa financeiramente estratégica para o...
Pablo Silva
 
OKR is the new black: porque esse framework está tão na moda?
OKR is the new black: porque esse framework está tão na moda?OKR is the new black: porque esse framework está tão na moda?
OKR is the new black: porque esse framework está tão na moda?
Pablo Silva
 
Transformando times de desenvolvimento mercenários em times de produto missio...
Transformando times de desenvolvimento mercenários em times de produto missio...Transformando times de desenvolvimento mercenários em times de produto missio...
Transformando times de desenvolvimento mercenários em times de produto missio...
Pablo Silva
 
As próximas ondas da tecnologia
As próximas ondas da tecnologiaAs próximas ondas da tecnologia
As próximas ondas da tecnologia
Pablo Silva
 
Carreira Dev: dicas pra você que vai chegar na semana que vem
Carreira Dev: dicas pra você que vai chegar na semana que vemCarreira Dev: dicas pra você que vai chegar na semana que vem
Carreira Dev: dicas pra você que vai chegar na semana que vem
Pablo Silva
 
Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio
Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio
Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio
Pablo Silva
 
Lets talk about OKRs
Lets talk about OKRsLets talk about OKRs
Lets talk about OKRs
Pablo Silva
 
2 anos usando OKRs: adeus achismo-driven
2 anos usando OKRs: adeus achismo-driven2 anos usando OKRs: adeus achismo-driven
2 anos usando OKRs: adeus achismo-driven
Pablo Silva
 
Ágil nao é mais tendência, é sobrevivência!
Ágil nao é mais tendência, é sobrevivência!Ágil nao é mais tendência, é sobrevivência!
Ágil nao é mais tendência, é sobrevivência!
Pablo Silva
 
Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...
Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...
Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...
Pablo Silva
 
Nem só de codigo vive homem (Management version)
Nem só de codigo vive homem (Management version)Nem só de codigo vive homem (Management version)
Nem só de codigo vive homem (Management version)
Pablo Silva
 
Nem só de código vive o homem (Versão para desenvolvedores)
Nem só de código vive o homem (Versão para desenvolvedores)Nem só de código vive o homem (Versão para desenvolvedores)
Nem só de código vive o homem (Versão para desenvolvedores)
Pablo Silva
 
Dual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimento
Dual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimentoDual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimento
Dual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimento
Pablo Silva
 
Revisão sobre ponteiros em C
Revisão sobre ponteiros em CRevisão sobre ponteiros em C
Revisão sobre ponteiros em C
Pablo Silva
 
Structs em C
Structs em CStructs em C
Structs em C
Pablo Silva
 

Mais de Pablo Silva (18)

Agilidade, times e outras coisas mais
Agilidade, times e outras coisas maisAgilidade, times e outras coisas mais
Agilidade, times e outras coisas mais
 
Times de produto de alta performance
Times de produto de alta performanceTimes de produto de alta performance
Times de produto de alta performance
 
Times de produto de alta performance
Times de produto de alta performanceTimes de produto de alta performance
Times de produto de alta performance
 
Transformação Digital: Criando uma empresa financeiramente estratégica para o...
Transformação Digital: Criando uma empresa financeiramente estratégica para o...Transformação Digital: Criando uma empresa financeiramente estratégica para o...
Transformação Digital: Criando uma empresa financeiramente estratégica para o...
 
OKR is the new black: porque esse framework está tão na moda?
OKR is the new black: porque esse framework está tão na moda?OKR is the new black: porque esse framework está tão na moda?
OKR is the new black: porque esse framework está tão na moda?
 
Transformando times de desenvolvimento mercenários em times de produto missio...
Transformando times de desenvolvimento mercenários em times de produto missio...Transformando times de desenvolvimento mercenários em times de produto missio...
Transformando times de desenvolvimento mercenários em times de produto missio...
 
As próximas ondas da tecnologia
As próximas ondas da tecnologiaAs próximas ondas da tecnologia
As próximas ondas da tecnologia
 
Carreira Dev: dicas pra você que vai chegar na semana que vem
Carreira Dev: dicas pra você que vai chegar na semana que vemCarreira Dev: dicas pra você que vai chegar na semana que vem
Carreira Dev: dicas pra você que vai chegar na semana que vem
 
Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio
Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio
Dual Track Agile - A integração da tecnologia, experiência do usuário e negócio
 
Lets talk about OKRs
Lets talk about OKRsLets talk about OKRs
Lets talk about OKRs
 
2 anos usando OKRs: adeus achismo-driven
2 anos usando OKRs: adeus achismo-driven2 anos usando OKRs: adeus achismo-driven
2 anos usando OKRs: adeus achismo-driven
 
Ágil nao é mais tendência, é sobrevivência!
Ágil nao é mais tendência, é sobrevivência!Ágil nao é mais tendência, é sobrevivência!
Ágil nao é mais tendência, é sobrevivência!
 
Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...
Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...
Dual Track Agile - PO, UX e Marketing no seu pipelane de desenvolvimento de p...
 
Nem só de codigo vive homem (Management version)
Nem só de codigo vive homem (Management version)Nem só de codigo vive homem (Management version)
Nem só de codigo vive homem (Management version)
 
Nem só de código vive o homem (Versão para desenvolvedores)
Nem só de código vive o homem (Versão para desenvolvedores)Nem só de código vive o homem (Versão para desenvolvedores)
Nem só de código vive o homem (Versão para desenvolvedores)
 
Dual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimento
Dual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimentoDual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimento
Dual track Agile - Incluindo o PO e UX em seu pipeline de desenvolvimento
 
Revisão sobre ponteiros em C
Revisão sobre ponteiros em CRevisão sobre ponteiros em C
Revisão sobre ponteiros em C
 
Structs em C
Structs em CStructs em C
Structs em C
 

Último

Sinais de pontuação
Sinais de pontuaçãoSinais de pontuação
Sinais de pontuação
Mary Alvarenga
 
Unificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da AlemanhaUnificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da Alemanha
Acrópole - História & Educação
 
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
Escola Municipal Jesus Cristo
 
A dinâmica da população mundial de acordo com as teorias populacionais.pptx
A dinâmica da população mundial de acordo com as teorias populacionais.pptxA dinâmica da população mundial de acordo com as teorias populacionais.pptx
A dinâmica da população mundial de acordo com as teorias populacionais.pptx
ReinaldoSouza57
 
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
LucianaCristina58
 
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdfiNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
andressacastro36
 
Aula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptxAula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptx
kdn15710
 
05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx
ValdineyRodriguesBez1
 
os-lusiadas-resumo-os-lusiadas-10-ano.pdf
os-lusiadas-resumo-os-lusiadas-10-ano.pdfos-lusiadas-resumo-os-lusiadas-10-ano.pdf
os-lusiadas-resumo-os-lusiadas-10-ano.pdf
GiselaAlves15
 
Arundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdf
Arundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdfArundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdf
Arundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdf
Ana Da Silva Ponce
 
Caça-palavras ortografia M antes de P e B.
Caça-palavras    ortografia M antes de P e B.Caça-palavras    ortografia M antes de P e B.
Caça-palavras ortografia M antes de P e B.
Mary Alvarenga
 
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdfCaderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
carlaslr1
 
Fernão Lopes. pptx
Fernão Lopes.                       pptxFernão Lopes.                       pptx
Fernão Lopes. pptx
TomasSousa7
 
Sócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slidesSócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slides
jbellas2
 
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxSlides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
LuizHenriquedeAlmeid6
 
Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...
Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...
Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...
Luana Neres
 
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptxApresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
JulianeMelo17
 
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
Escola Municipal Jesus Cristo
 
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptxLIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
WelidaFreitas1
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
LuizHenriquedeAlmeid6
 

Último (20)

Sinais de pontuação
Sinais de pontuaçãoSinais de pontuação
Sinais de pontuação
 
Unificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da AlemanhaUnificação da Itália e a formação da Alemanha
Unificação da Itália e a formação da Alemanha
 
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
BULLYING NÃO É AMOR.pdf LIVRO PARA TRABALHAR COM ALUNOS ATRAVÉS DE PROJETOS...
 
A dinâmica da população mundial de acordo com as teorias populacionais.pptx
A dinâmica da população mundial de acordo com as teorias populacionais.pptxA dinâmica da população mundial de acordo com as teorias populacionais.pptx
A dinâmica da população mundial de acordo com as teorias populacionais.pptx
 
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx- TEMPLATE DA PRATICA - Psicomotricidade.pptx
- TEMPLATE DA PRATICA - Psicomotricidade.pptx
 
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdfiNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
iNTRODUÇÃO À Plantas terrestres e Plantas aquáticas. (1).pdf
 
Aula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptxAula01 - ensino médio - (Filosofia).pptx
Aula01 - ensino médio - (Filosofia).pptx
 
05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx05-os-pre-socraticos sociologia-28-slides.pptx
05-os-pre-socraticos sociologia-28-slides.pptx
 
os-lusiadas-resumo-os-lusiadas-10-ano.pdf
os-lusiadas-resumo-os-lusiadas-10-ano.pdfos-lusiadas-resumo-os-lusiadas-10-ano.pdf
os-lusiadas-resumo-os-lusiadas-10-ano.pdf
 
Arundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdf
Arundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdfArundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdf
Arundhati Roy - O Deus das Pequenas Coisas - ÍNDIA.pdf
 
Caça-palavras ortografia M antes de P e B.
Caça-palavras    ortografia M antes de P e B.Caça-palavras    ortografia M antes de P e B.
Caça-palavras ortografia M antes de P e B.
 
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdfCaderno de Formação_PORTUGUÊS ESTRAN.pdf
Caderno de Formação_PORTUGUÊS ESTRAN.pdf
 
Fernão Lopes. pptx
Fernão Lopes.                       pptxFernão Lopes.                       pptx
Fernão Lopes. pptx
 
Sócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slidesSócrates e os sofistas - apresentação de slides
Sócrates e os sofistas - apresentação de slides
 
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptxSlides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
Slides Lição 10, Central Gospel, A Batalha Do Armagedom, 1Tr24.pptx
 
Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...
Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...
Aula 3- 6º HIS - As origens da humanidade, seus deslocamentos e os processos ...
 
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptxApresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
Apresentação_Primeira_Guerra_Mundial 9 ANO-1.pptx
 
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...proposta curricular  ou plano de cursode lingua portuguesa eja anos finais ( ...
proposta curricular ou plano de cursode lingua portuguesa eja anos finais ( ...
 
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptxLIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
LIÇÃO 9 - ORDENANÇAS PARA UMA VIDA DE SANTIFICAÇÃO.pptx
 
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptxSlides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
Slides Lição 11, CPAD, A Realidade Bíblica do Inferno, 2Tr24.pptx
 

Recursividade

  • 2. Recursividade Muitos algoritmos têm a seguinte propriedade: cada instância do problema contém uma instância menor do mesmo problema. Dizemos que esses problemas têm estrutura recursiva, porque é possível resolver o problema chamando à si mesmo com uma instância menor do problema.
  • 3. Recursividade Uma função que chama à si mesmo é dita recursiva.
  • 4. Funções que chamam outras funções Esse conceito tem que ficar bem claro: Uma função pode chamar uma outra ou mais funções. Vamos ver um exemplo.
  • 5. Calcular a mesada Suponha que queremos um programa para calcular a mesada de nossos filhos, baseado em suas idades e notas. Seja então a seguinte função calcMesada. Não se preocupem com a main, ela logo aparecerá. Não precisamos criar a main primeiro sempre, mas ela terá que ser criada em algum momento! O que esta função faz é receber um parâmetro que será a idade do nosso filho e retorna um valor maior da mesada para filhos maiores de idade.
  • 6. Calcular a mesada Digamos agora que, a mesada de nossos filhos menores de idade, tem que ser recompensada (ou não!) por suas notas. Então criamos a seguinte função que dá um bônus ou um desconto (bd) para nosso filho menor de idade. Essa função recebe três parâmetros: a idade, a nota e o valor da mesada já calculada pela função anterior. Por isso é muito importante chamar as funções na ordem em que queremos os resultados. Se não calcularmos a mesada antes com a outra função, como vamos passa-la como parâmetro aqui!?Se a idade do nosso filho for menor que 18, vamos variar a mesada de acordo com a nota dele, senão, vamos somente retornar o mesmo valor da mesada que passamos para a função.
  • 7. Calcular a mesada Na main, vamos receber o valor da idade e a nota através da função scanf (permite que o usuário digite valores e armazena nas variáveis passada como parâmetro). Após isso, chamamos a função calcMesada para calcular a mesada e atribuímos este valor a variável mesada. Agora vamos chamar a nossa segunda função e passando como parâmetro a própria mesada obtida anteriormente.
  • 8. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ?
  • 9. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 1: variável mesada é criada sem valor algum por enquanto. mesada &43jjuiop
  • 10. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 2: variável idade é criada sem valor algum por enquanto. mesada &43jjuiop idade &4399uiop
  • 11. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 3: variável nota é criada sem valor algum por enquanto. mesada &43jjuiop idade &4399uiop nota &43666iop
  • 12. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 4: mensagem exibida na tela: Entre com a idade do seu filho:
  • 13. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 5: o usuário digita um valor para idade e esse valor vai para a variável idade. Entre com a idade do seu filho: 10 10 idade &4399uiop
  • 14. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 6: mensagem é exibida na tela Entre com a idade do seu filho: 10 Entre com a nota geral do seu filho:
  • 15. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Passo 7: o usuário entra com o valor da nota e esse valor vai direto para a variável nota. Entre com a idade do seu filho: 10 Entre com a nota geral do seu filho: 1 1 nota &43666iop
  • 16. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 8 ? ? ? Vamos para a função! A seta está para cima porque uma função que é chamada por outra função sempre deve ser declarada acima da função que à está chamando. Do contrário, a função não conseguirá chama- la! 10 Estamos passando o valor da idade e não uma referência. Por isso nossa caixinha só tem um valor e nada de referências para a variável idade. (Recebemos este valor anteriormente!)
  • 17. Vamos executar este programa int calcMesada(int idade){ if(idade < 18) return idade*20; else { return idade*50; } } Passo 9: Uma nova caixinha (varíavel) chamada idade é criada e o valor que “jogamos” (passamos como parâmetro na chamada da função) para a função é colocado lá dentro. 10 9 10 11 12 13 14 10 idade &9999uiop Muito importante entender aqui que essa caixinha tem o mesmo nome que a caixinha da idade que está na main. Mas como pode ser visto os endereços são diferentes. ELAS NÃO SÃO A MESMA VARIÁVEL, SOMENTE TEM O MESMO NOME. Já sabemos que não podemos ter duas variáveis com o mesmo nome, mas esta regra é válida para mesmas funções. Funções diferentes podem ter variáveis com mesmo nome, que é o nosso caso! Lembre-se, uma função não consegue ver nada que está dentro de outra função. O escopo de uma função é digamos “secreto” para todas as outras!
  • 18. Vamos executar este programa int calcMesada(int idade){ if(idade < 18) return idade*20; else { return idade*50; } } Passo 10: Verificamos se a idade é menor que 18. Para este nosso caso ela é, então o passo 11 será executado! 9 10 11 12 13 14 10 idade &9999uiop Lembre-se, uma função não consegue ver nada que está dentro de outra função. O escopo de uma função é digamos “secreto” para todas as outras!
  • 19. Vamos executar este programa int calcMesada(int idade){ if(idade < 18) return idade*20; else { return idade*50; } } Passo 11: Encontramos a palavra return. Portanto neste momento vamos retornar o valor da multiplicação de idade por 20 para o local onde esta função foi chamada. Neste caso é a na main.9 10 11 12 13 10 idade &9999uiop Importante: os passos 12, 13 nunca serão executados, pois uma vez que em uma função, é encontrado a palavra de retorno, ela imediatamente interrompe sua execução e retorna o valor passado para o return. 200 Só podemos retornar valores que já temos. Por isso, o retorno para a main só vai acontecer quando o computador processar a operação idade*20 e substituir o valor desta multiplicação na expressão. Se o computador demorasse 10 anos para computar esta multiplicação, então demoraríamos 10 anos para voltar para a main!
  • 20. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 812 ? ? Passo 12: a caixinha de mesada recebe o valor de retorno da função. 13 200 mesada &43jjuiop 200
  • 21. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 812 ? ? Passo 13: vamos novamente para outra função. Chamamos bdMesada enviando os valores dos nossos três parâmetros! (Passagem por valor!) 13 200 mesada &43jjuiop 10 idade &4399uiop 1 nota &43666iop 10 1 200
  • 22. Vamos executar este programa int bdMesada(int idade, int notas, int mesada){ if(idade < 18) return mesada*notas; return mesada; } Passo 14: São criadas novas caixinhas para os nossos parâmetros que vão receber os valores enviados na chamada da função, na mesma ordem enviada. 14 15 16 17 Lembre-se, uma função não consegue ver nada que está dentro de outra função. O escopo de uma função é digamos “secreto” para todas as outras! 200 mesada &99yjuiop 10 idade &4oouiop 1 nota &4wertiop MESMOS NOMES, MAS ENDEREÇOS DIFERENTES! 10 1 200
  • 23. Vamos executar este programa int bdMesada(int idade, int notas, int mesada){ if(idade < 18) return mesada*notas; return mesada; } Passo 15: Vamos ver se a idade é menor que 18. Para o nosso caso é, então vamos executar o passo 16. 14 15 16 17 Lembre-se, uma função não consegue ver nada que está dentro de outra função. O escopo de uma função é digamos “secreto” para todas as outras! 200 mesada &99yjuiop 10 idade &4oouiop 1 nota &4wertiop MESMOS NOMES, MAS ENDEREÇOS DIFERENTES!
  • 24. Vamos executar este programa int bdMesada(int idade, int notas, int mesada){ if(idade < 18) return mesada*notas; return mesada; } Passo 16: Encontramos a palavra return e então vamos retornar para o local que esta função foi chamada, retornando o valor de mesada*notas que para nosso caso é 200*1 = 200. O passo 17 então não será executado, pois interrompemos a execução no momento do retorno. 14 15 16 17 Lembre-se, uma função não consegue ver nada que está dentro de outra função. O escopo de uma função é digamos “secreto” para todas as outras! 200 mesada &99yjuiop 10 idade &4oouiop 1 nota &4wertiop 200 Novamente, retornamos valores e nunca expressões! Para que a função retorne para onde foi chamada, o computador primeiro tem que fazer a multiplicação e devolver um valor para o retorno!
  • 25. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 812 15 16 Passo 14: a caixinha da mesada, vai receber o valor de retorno da função. Como já tínhamos um valor lá, ele será substituído pelo novo. Coincidentemente, este valor é o mesmo, porque nossa multiplicação na função foi por 1. De qualquer maneira o valor será substituído, mesmo que seja pelo mesmo valor! 13 10 idade &4399ui 1 nota &43666iop 14 200 200 mesada &43jjuiop 200
  • 26. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 812 15 16 Passo 15: É exibida uma mensagem na tela com o valor da variável mesada, que é a saída final do nosso programa e o objetivo que queríamos atingir. 1314 200 Entre com a idade do seu filho: 10 Entre com a nota geral do seu filho: 1 O valor da mesada para seu filho e: 200.
  • 27. Vamos executar este programa int main(){ int mesada; int idade; int nota; printf("Entre com a idade do seu filho:"); scanf("%d", &idade); printf("Entre com a nota geral do seu filho:"); scanf("%d", &nota); mesada = calcMesada(idade); mesada = bdMesada(idade,nota,mesada); printf("nnO valor da mesada para seu filho e: %d", mesada); return 0; } 1 2 3 4 5 6 7 812 15 16 Passo 16: Programa termina. É exibida na tela uma mensagem padrão da linguagem. 1314 200 Entre com a idade do seu filho: 10 Entre com a nota geral do seu filho: 1 O valor da mesada para seu filho e: 200. Program returned with execution of 0.2222s
  • 28. Recursividade Como já vimos que uma função pode chamar uma ou mais funções, então não há porque duvidar que uma função pode chamar à ela mesma! Vamos ver como funciona então uma função recursiva.
  • 29. Vamos ver um exemplo int main(){ exemplo(‘c’); return 0; } void exemplo(char a){ printf(“%c”, a); exemplo(a); } Digamos que temos a função exemplo e chamamos ela na main passando o caracter ‘c’. Vamos ver como será a execução. 1 2 3 4 5 ?
  • 30. Vamos ver um exemplo int main(){ exemplo(‘c’); return 0; } 1 2 ? Passo 1: o programa se inicia.
  • 31. Vamos ver um exemplo int main(){ exemplo(‘c’); return 0; } 1 2 ? Passo 2: vamos para a função e estamos passando o caracter ‘c’ utilizando passagem por valor. Dessa vez nem mesmo temos variáveis na main. Só estamos querendo chamar a função para ver o qual é seu comportamento recursivo. c
  • 32. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 3: Uma variável (caixinha) do tipo char é criada e o valor passado na chamada da função é atribuído à ela. c c a &3399uiop
  • 33. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 4: Imprimimos o caracter que está na variável a na tela. c a &3399uiop c
  • 34. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 5: O passo cinco é chamado passo recursivo, que é quando chamamos a mesma função dentro dela. Veja, estamos passando a variável a por valor. Logo, vamos jogar novamente a letra c para a função. c a &3399uiop c Muito importante lembrar que, quando uma função termina o seu escopo, tudo que está dentro dela é destruído. Portanto a caixinha a será destruída e recriada, possivelmente em um novo endereço.
  • 35. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 3: Uma nova caixinha (variável) de nome a será criada e armazenará o valor que passamos na chamada da função. c a &3633uiop c Provavelmente esta nova caixinha terá um novo endereço. A memória é bastante aleatória.
  • 36. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 4: Imprimimos novamente a letra c na tela. cc
  • 37. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 5: Chamamos novamente a nossa função. Outro passo recursivo. E tudo recomeça outra vez. c a &3633uiop c
  • 38. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 3: Uma nova caixinha (variável) de nome a será criada e armazenará o valor que passamos na chamada da função. c a &456guiop c Provavelmente esta nova caixinha terá um novo endereço. A memória é bastante aleatória.
  • 39. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 4: Imprimimos novamente a letra c na tela. ccc
  • 40. Vamos ver um exemplo void exemplo(char a){ printf(“%c”, a); exemplo(a); } 3 4 5 Passo 5: Chamamos novamente a nossa função. Outro passo recursivo. E tudo recomeça outra vez. c a &3633uiop c
  • 41. Recursividade CHEGAAAAAA! UFF! Como fazer a recursão parar? Pois é, esta é outra característica de uma função recursiva. Ela precisa sempre ter um Caso Base, que vai determinar quando ela vai parar de se chamar.
  • 42. Caso base void exemplo(char a){ printf(“%c”, a); exemplo(a); } Para esta função, nem conseguiríamos criar um caso base sem que tivéssemos mais um parâmetro, que frequentemente é o contador dos passos recursivos. Esse contador sempre é diminuído por um fator qualquer (depende do nosso problema) até que ele encontre um caso base. Esta característica torna a recursão, uma resolução de problemas por instâncias menores do mesmo problema. A cada passo recursivo, o nosso problema diminui, até que cheguemos no caso base, que será a menor instância do nosso problema.
  • 43. Caso base void exemplo(char a){ printf(“%c”, a); exemplo(a); } É muito importante modelar a função recursiva de maneira correta, pois senão, como vimos, nosso programa pode entrar em loop e nunca parar!
  • 44. Funções recursivas Vamos ver um exemplo prático agora. Seja o fatorial matemático definido por n!: 1! = 1 2! = 2*1 = 2*1! 3! = 3*2*1 = 3*2! 4! = 4*3*2*1 = 4*3! 5! = 5*4*3*2*1 = 5*4! ..................................... n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)! Para criar uma função recursiva que resolva este problema, precisamos encontrar dois elementos essenciais para a recursão: 1) Caso base 2) Passo recursivo
  • 45. Funções recursivas Vamos ver um exemplo prático agora. Seja o fatorial matemático definido por n!: 1! = 1 2! = 2*1 = 2*1! 3! = 3*2*1 = 3*2! 4! = 4*3*2*1 = 4*3! 5! = 5*4*3*2*1 = 5*4! ..................................... n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)! O caso base é muito simples, e logicamente que é 1. Se olharmos para todas as linhas, elas sempre terminam no 1 e por isso ele é o nosso caso base. Pense no caso base, como o elemento que sempre vai ser atingindo em algum momento e ele deve ser, pois do contrário como vamos parar a recursão?
  • 46. Funções recursivas Vamos ver um exemplo prático agora. Seja o fatorial matemático definido por n!: 1! = 1 2! = 2*1 = 2*1! 3! = 3*2*1 = 3*2! 4! = 4*3*2*1 = 4*3! 5! = 5*4*3*2*1 = 5*4! ..................................... n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)! O passo recursivo é aquele em que diminuímos a instância do nosso problema por algum fator. Para o nosso caso ele é dado pela nossa fórmula geral: n*(n-1)! Vamos entender o por que.
  • 47. Funções recursivas Vamos ver um exemplo prático agora. Seja o fatorial matemático definido por n!: 1! = 1 2! = 2*1 = 2*1! 3! = 3*2*1 = 3*2! 4! = 4*3*2*1 = 4*3! 5! = 5*4*3*2*1 = 5*4! ..................................... n! = n*(n-1)*(n-2)*...*(1) = n*(n-1)! n*(n-1)! nos diz o seguinte: Multiplique a instância do meu problema de valor n por uma nova instância de valor n-1. Para encontrarmos o valor da instância n-1 vamos ter que realizar novamente o fatorial. Percebe que utilizamos o fatorial novamente para calcular (n-1)!. Com certeza este é o nosso passo recursivo, pois a cada chamada, vamos diminuir a instância do nosso problema por um fator de 1.
  • 48. Funções recursivas Nossa função então ficaria da seguinte maneira: int fatorial(int n){ } A função tem que retornar um inteiro, pois é o valor do fatorial que queremos encontrar!
  • 49. Funções recursivas Nossa função então ficaria da seguinte maneira: int fatorial(int n){ if( n == 1 ) return 1; } Sempre numa função recursiva, a primeira coisa a fazer é colocar o caso base. Sabemos que o fatorial de 1 é 1 e então este será o nosso valor de retorno.
  • 50. Funções recursivas Nossa função então ficaria da seguinte maneira: int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } Agora então definimos nosso passo recursivo, dado pela fórmula geral. O passo recursivo é exatamente a nossa fórmula geral, porém escrito na linguagem de programação e não numa fórmula matemática. E nossa função recursiva está pronta! Vamos testá-la.
  • 51. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 3 1 2 3 4 Passo 1: uma caixinha para n é criada e o valor 3 colocado lá dentro. 3 n &3633uiop
  • 52. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 1 2 3 4 Passo 2: verificamos se atingimos nosso caso base. Como n não é igual a 1, ainda não o atingimos. Pulamos então para o passo 4. 3 n &3633uiop
  • 53. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 1 2 3 4 Passo 4: Passo recursivo. Vamos chamar nossa função novamente passando um novo valor de n. 3 n &3633uiop 2
  • 54. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 5 6 7 8 Passo 5: Uma nova caixinha para n é criada e o valor de chamada é atribuído à ela. 2 n &2223uiop 2
  • 55. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 5 6 7 8 Passo 6: Verificamos novamente o nosso caso base. Ainda não o atingimos, e então o passo 7 será pulado. 2 n &2223uiop
  • 56. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 5 6 7 8 Passo 8: Uma nova chamada recursiva é realizada com uma instância ainda menor do problema. 2 n &2223uiop 1
  • 57. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 9 10 11 12 Passo 9: Novamente uma nova caixinha para n é criada, e o valor passado na chamada é atribuído para ela. 1 n &9923uiop 1
  • 58. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 9 10 11 12 Passo 10: Verificamos o nosso caso base e percebemos que acabamos de atingí-lo! Então o passo 12 não será executado. 1 n &9923uiop 1
  • 59. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 9 10 11 12 Passo 11: Mas e agora, encontramos a palavra return, para onde temos que retornar? Para a main? 1 n &9923uiop
  • 60. Recursividade Entender para onde voltar quando atingimos o caso base é essencial para conseguirmos entender o que é recursividade. Vamos ver uma mapa desta execução.
  • 61. Recursividade Na primeira chamada tínhamos o seguinte passo recursivo: 1) 3 * fatorial(3-1)
  • 62. Recursividade Na segunda chamada: 1) 3 * fatorial(3-1) 2) 2 * fatorial(2-1)
  • 63. Recursividade Na terceira chamada: 1) return 3 * fatorial(3-1) 2) return 2 * fatorial(2-1) 3) return 1 A terceira chamada foi onde encontramos o nosso caso base. Dessa maneira, o valor de retorno da chamada em que o caso base é encontrado deve ser retornado para exatamente a última chamada efetuada antes do caso base. Perceba que todas as chamadas são também retornos e mais uma vez, um retorno só pode conter valores já definidos. O que acontece nas chamadas 2 e 3, é que elas estão esperando valores de retorno para poderem realizar a multiplicação. Já na chamada 3 não, 1 já é um valor definido e não tem que realizar nenhuma operação.
  • 64. Recursividade Logo: 1) return 3 * fatorial(3-1) 2) return 2 * fatorial(2-1) 3) return 1 1
  • 65. Recursividade Logo: 1) return 3 * fatorial(3-1) 2) return 2 * 3) return 1 1 Agora a chamada 2 pode realizar a multiplicação e retornar seu valor para a chamada 1.
  • 66. Recursividade Logo: 1) return 3 * fatorial(3-1) 2) return 2 3) return 1 2
  • 67. Recursividade Logo: 1) return 3 * 2) return 2 3) return 1 2 Por fim, a chamada 3 pode realizar também a multiplicação e retornar para onde foi chamada. Como vimos no começo, assumimos que chamamos a função fatorial na main e então é pra lá que o retorno da primeira chamada irá voltar, devolvendo enfim o valor do fatorial de 3 que é 6!
  • 68. Recursividade Logo: 1) return 6 2) return 2 3) return 1 6 Assim se encerra a nossa função recursiva!
  • 69. Finalizando a execução Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 9 10 11 12 1
  • 70. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 5 6 7 8 2
  • 71. Funções recursivas Vamos assumir que chamamos esta função na main e passamos o valor 3 na chamada. int fatorial(int n){ if( n == 1 ) return 1; return n * fatorial(n-1); } 1 2 3 4 2 6 Voltando pra main com 6!
  • 72. Funções recursivas Escreva uma função recursiva que retorne o valor de um número elevado por n. Exemplo: exp(4,2) -> significa que queremos elevar 4 ao quadrado. Quem fizer este exercício e me explicar na sala, poderá errar um exercício no mini-teste.