Recursividade: mudanças entre as edições
(14 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 2: | Linha 2: | ||
'''Recursividade''' é o ato de uma função chamar a si mesma<ref>http://pt.wikipedia.org/wiki/Recursividade</ref>. | '''Recursividade''' é o ato de uma função chamar a si mesma<ref>http://pt.wikipedia.org/wiki/Recursividade</ref>. | ||
==Função Fatorial== | |||
Uma função que calcule o '''fatorial''' de um número inteiro '''n''' (simbolizado por '''n!''') é um bom exemplo de uma função recursiva. | Uma função que calcule o '''fatorial''' de um número inteiro '''n''' (simbolizado por '''n!''') é um bom exemplo de uma função recursiva. | ||
Por exemplo: | Por exemplo: | ||
0! = 1 | |||
1! = 1 | |||
2! = 2 . 1 = 2 | |||
3! = 3 . 2 . 1 = 6 | |||
4! = 4 . 3 . 2 . 1 = 24 | |||
5! = 5 . 4 . 3 . 2 . 1 = 120 | 5! = 5 . 4 . 3 . 2 . 1 = 120 | ||
Desta forma, posso expressar: | Desta forma, posso expressar: | ||
1! = 1 . 0! | |||
2! = 2 . 1! | |||
3! = 3 . 2! | |||
4! = 4 . 3! | |||
5! = 5 . 4! | 5! = 5 . 4! | ||
Note que, nos exemplos acima, que: | Note que, nos exemplos acima, que: | ||
n! = n . (n - 1)! | n! = n . (n - 1)! | ||
Linha 24: | Linha 28: | ||
<source lang="c"> | <source lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
int fatorial(int n) | int fatorial(int n) | ||
{ | { | ||
if (n <= 1) | |||
return 1; | |||
else | |||
return n * fatorial(n-1); | |||
} | } | ||
Linha 41: | Linha 46: | ||
</source> | </source> | ||
==Multiplicação de dois números naturais== | |||
Outro exemplo de recursividade pode ser obtido na multiplicação de dois números naturais. O produto '''a * b''' pode ser obtido como '''a''' somado a si mesmo '''b''' vezes. Esta multiplicação pode ser implementada por um programa interativo. Uma definição recursiva equivalente é<ref name="TENENBAUM">TENENBAUM, A. A.; LANGSAM, Y.; AUGENSTEIN, M.J. Estruturas de dados usando C, capítulo 3: Recursividade, São Paulo: Makron Books, 1995.</ref>.: | |||
a * b = 0 se b = 0 | |||
a * b = a se b = 1 | |||
a * b = a * (b - 1) + a se b > 1 | |||
;Exercício: Implemente uma função recursiva para multiplicar dois números naturais. | |||
==Sequência de Fibonacii== | |||
Examine a sequência de números a seguir, conhecida como '''Sequência de Fibonacii''': | |||
0 1 1 2 3 5 8 13 21 34 55 ... | |||
Cada número da sequência é a soma dos dois números anteriores: | |||
0 + 1 = 1 | |||
1 + 1 = 2 | |||
1 + 2 = 3 | |||
2 + 3 = 5 | |||
3 + 5 = 8 | |||
... | |||
Se fizermos | |||
fib(0) = 0 | |||
fib(1) = 1 | |||
podemos definir a sequência de Fibonacci de maneira recursiva como<ref name="TENENBAUM">TENENBAUM, A. A.; LANGSAM, Y.; AUGENSTEIN, M.J. Estruturas de dados usando C, capítulo 3: Recursividade, São Paulo: Makron Books, 1995.</ref>: | |||
fib(n) = n se n = 0 ou n = 1 | |||
fib(n) = fib(n - 2) + fib(n - 1) se n >= 2 | |||
;Excercício: Implemente uma função recursiva para implementar uma sequência de Fibonacci para um dado inteiro n. | |||
==Torres de Hanoy== | |||
;Pesquisa e exercício: | |||
#Faça uma pesquisa sobre o problema conhecido como '''Torres de Hanoy'''; | |||
#Pesquise e implemente um programa que resolva o problema das '''Torres de Hanoy''', utilizando funções recursivas. | |||
===Número mínimo de movimentos=== | |||
[https://www.youtube.com/watch?v=egDMknOIK7g Função matemática] | |||
===Solução interativa X Solução recursiva=== | |||
[http://pt.wikipedia.org/wiki/Torre_de_Hanói Wikipédia: Torres de Hanoy] | |||
<source lang="c"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
void solve(int QTD_DISCOS, char origem, char destino, char temp) { | |||
static int rank = 0; | |||
if (QTD_DISCOS > 0) { | |||
solve(QTD_DISCOS-1, origem, temp, destino); | |||
printf("%4d ) %c --> %c\n", ++rank, origem, destino); | |||
solve(QTD_DISCOS-1, temp, destino, origem); | |||
} | |||
} | |||
void main() { | |||
int nr; | |||
printf("Digite o numero de discos: "); | |||
scanf("%d", &nr); | |||
solve(nr, 'A', 'C', 'B'); | |||
} | |||
</source> | |||
==Referências== | ==Referências== |
Edição atual tal como às 23h57min de 23 de outubro de 2014
Recursividade
Recursividade é o ato de uma função chamar a si mesma[1].
Função Fatorial
Uma função que calcule o fatorial de um número inteiro n (simbolizado por n!) é um bom exemplo de uma função recursiva.
Por exemplo:
0! = 1 1! = 1 2! = 2 . 1 = 2 3! = 3 . 2 . 1 = 6 4! = 4 . 3 . 2 . 1 = 24 5! = 5 . 4 . 3 . 2 . 1 = 120
Desta forma, posso expressar:
1! = 1 . 0! 2! = 2 . 1! 3! = 3 . 2! 4! = 4 . 3! 5! = 5 . 4!
Note que, nos exemplos acima, que:
n! = n . (n - 1)!
- Função em C para calcular o fatorial de um número inteiro n
#include <stdio.h>
int fatorial(int n)
{
if (n <= 1)
return 1;
else
return n * fatorial(n-1);
}
int main()
{
int a;
printf("\nEntre com um valor inteiro :");
scanf("%d",&a);
printf("O fatorial de %d é %d\n\n",a,fatorial(a));
return(0);
}
Multiplicação de dois números naturais
Outro exemplo de recursividade pode ser obtido na multiplicação de dois números naturais. O produto a * b pode ser obtido como a somado a si mesmo b vezes. Esta multiplicação pode ser implementada por um programa interativo. Uma definição recursiva equivalente é[2].:
a * b = 0 se b = 0 a * b = a se b = 1 a * b = a * (b - 1) + a se b > 1
- Exercício
- Implemente uma função recursiva para multiplicar dois números naturais.
Sequência de Fibonacii
Examine a sequência de números a seguir, conhecida como Sequência de Fibonacii:
0 1 1 2 3 5 8 13 21 34 55 ...
Cada número da sequência é a soma dos dois números anteriores:
0 + 1 = 1 1 + 1 = 2 1 + 2 = 3 2 + 3 = 5 3 + 5 = 8 ...
Se fizermos
fib(0) = 0 fib(1) = 1
podemos definir a sequência de Fibonacci de maneira recursiva como[2]:
fib(n) = n se n = 0 ou n = 1 fib(n) = fib(n - 2) + fib(n - 1) se n >= 2
- Excercício
- Implemente uma função recursiva para implementar uma sequência de Fibonacci para um dado inteiro n.
Torres de Hanoy
- Pesquisa e exercício
- Faça uma pesquisa sobre o problema conhecido como Torres de Hanoy;
- Pesquise e implemente um programa que resolva o problema das Torres de Hanoy, utilizando funções recursivas.
Número mínimo de movimentos
Solução interativa X Solução recursiva
#include <stdio.h>
#include <stdlib.h>
void solve(int QTD_DISCOS, char origem, char destino, char temp) {
static int rank = 0;
if (QTD_DISCOS > 0) {
solve(QTD_DISCOS-1, origem, temp, destino);
printf("%4d ) %c --> %c\n", ++rank, origem, destino);
solve(QTD_DISCOS-1, temp, destino, origem);
}
}
void main() {
int nr;
printf("Digite o numero de discos: ");
scanf("%d", &nr);
solve(nr, 'A', 'C', 'B');
}
Referências
- ↑ http://pt.wikipedia.org/wiki/Recursividade
- ↑ 2,0 2,1 TENENBAUM, A. A.; LANGSAM, Y.; AUGENSTEIN, M.J. Estruturas de dados usando C, capítulo 3: Recursividade, São Paulo: Makron Books, 1995.
--Evandro.cantu (discussão) 17h44min de 22 de outubro de 2014 (BRST)