Recursividade
• Função recursiva é aquela que chama a si
própria.
• Também pode ser considerado, se chamar
outras funções que, em algum momento,
chamem a primeira função, tornando esse
conjunto de funções um processo recursivo.
• É um recurso de programação que pode ser
usada na linguagem C, Java, Visual Basic, entre
outras.
Recursividade
• As funções recursivas são soluções mais
elegantes e simples, se comparadas a funções
tradicionais, já que executam tarefas repetitivas
sem utilizar nenhuma estrutura de repetição,
como for ou while.
• Essa elegância e simplicidade têm um preço
que requer muita atenção em sua
implementação.
Recursividade
• Uma função pode chamar a si própria por um
número limitado de vezes.
• Esse limite é dado pelo tamanho da pilha. Se o
valor correspondente ao tamanho máximo da pilha
for atingido, haverá um estouro da pilha ou “Stack
Overflow.
• Cada vez que uma função é chamada de forma
recursiva, são alojados e armazenados uma cópia
dos seus parâmetros, de modo a não perder os
valores dos parâmetros das chamadas anteriores.
Funções recursivas contem duas
partes fundamentais:
• Ponto de Parada ou Condição de Parada: é
o ponto onde a função será encerrada.
• Regra Geral: é o método que reduz a
resolução do problema através da invocação
recursiva de casos menores, que por sua vez
são resolvidos pela resolução de casos ainda
menores pela própria função, assim
sucessivamente até atingir o “ponto de parada”
que finaliza a função.
Exemplo de função recursiva:
cálculo do somatório
#include <iostream>
using namespace std;
int soma(int x) {
int y;
if( x == 0 )
{ cout <<x << " ) \n";
return 0;
}
else
{
cout <<" ( "<< x << " + ";
y = x + soma(x -1);
cout <<"soma parcial = "<<y<<"\n";
return y;
}
}
int main() {
int num;
cout << "Digite o numero: ";
cin >> num;;
cout<<"\nA soma de 0 ate "<<num <<" = "<<soma(num)<<"\n";
system("pause");
return 0;
}
Demonstrativo Somatório
5
15
5+Soma(5-1)
5+10
5+(4+Soma(4-1))
5+(4+6)
5+(4+(3+Soma(3-1)))
5+(4+(3+3)
5+(4+(3+(2+Soma(2-1))))
5+(4+(3+(2 +1)))
Exercícios:
1. Fazer uma função recursiva que calcule o fatorial de um número. O
número deverá ser lido no programa principal.
Demonstrativo da solução:
5!
120
5*4!
5*(24)
4*3!
4*(6)
3*2!
3*(2)
2*1!
2*(1)
1
1*(1)
Exercícios:
2. O que fará e qual será o resultado do exercício abaixo?
//Recursividade na Linguagem C
#include <math.h>
#include <iostream>
using namespace std;
int funcao(int x)
{
cout << "\n" << x;
if(abs(x) < 10 )
return 1;
else
return(1 + funcao(x/10));
}
int main()
{
int num;
num=10145;
cout <<" Total: " << funcao(num);
system ("pause");
return 0;
}
Exercícios:
3. Fazer um programa que leia,some 2 valores inteiros e mostre o
resultado da soma. No final do programa, deverá ter uma recursividade
que chame novamente o programa principal, mostre a mensagem
“Digite 1 se desejar executar o programa novamente”,caso positivo,
executar o programa novamente caso negativo, terminar a execução
do programa.
Exercícios:
4. Questão da prova do ENADE 2008.
Os termos da seqüência de Fibonacci são definidos por:
Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2)
Uma solução recursiva para o cálculo do i-ésimo termo da seqüência é
dada pela função a seguir.
1 funcao fibonacci(inteiro longo n)
2 se((n=0) OU (n=1)) entao
3
retorne n
4 senao
5
retorne fibonacci(n-1) + fibonacci(n-2)
6 fim se
7 fim
Exercícios:
(continuação exercício 4):
Acerca da execução recursiva dessa função, assinale a opção
incorreta.
A) À medida que o valor de n cresce, há um aumento no número de
chamadas recursivas.
B) O método recursivo é o mais eficiente para o cálculo do i-ésimo
termo da seqüência de Fibonacci, pois realiza duas chamadas por
passo da recursão, cada uma mais simples do que a chamada
original.
C) Na linha 5, a ordem de execução é calcular o valor para
fibonacci(n-1) e somente depois calcular o valor para fibonacci(n-2).
D) As condições de parada da recursão são: o valor de n é 0 ou o
valor de n é 1.
• fazer exercício que leia um numero,
calcule em uma função a soma deste
numero de 0 ate o numero lido em uma
função e mostre a soma deste numero.
Download

Recursividade na Linguagem C