Академический Документы
Профессиональный Документы
Культура Документы
MATEMATICA DISCRETA
Fuentes :Material comipilado:propio e Internet
Ing. De Sistemas e Informtica-UNMSM-Semestre 2009
Recursividad
Definicin
Un procedimiento o funcin se dice recursivo si durante su ejecucin se invoca directa o
indirectamente a s mismo. Esta invocacin depende al menos de una condicin que acta como
condicin de corte que provoca la finalizacin de la recursin.
Un algoritmo recursivo consta de:
1- Al menos un caso trivial o base, es decir, que no vuelva a invocarse y que se ejecuta cuando se
cumple cierta condicin, y
2- el caso general que es el que vuelve a invocar al algoritmo con un caso ms pequeo del mismo.
Los lenguajes como Pascal, que soportan recursividad, dan al programador una herramienta
poderosa para resolver ciertos tipos de problemas reduciendo la complejidad u ocultando los detalles del
problema.
La recursin es un medio particularmente poderoso en las definiciones matemticas. Para apreciar
mejor cmo es una llamada recursiva, estudiemos la descripcin matemtica de factorial de un nmero
entero no negativo:
n! =
1,
si n = 0
n * ( n - 1 ) * ( n - 2 ) * .. * 1 = n * ( n - 1 )!
si n > 0
n! =
1,
si n = 0
n*(n-1)!
si n > 0
Diagrama de Llaves:
(*Pre: n >= 0*)
n=0
Factorial(n)
Factorial 1
(*Caso base*)
n=0
(*Caso Gral*)
(* caso base *)
(* caso general *)
(* caso base *)
(* caso general *)
Instancia 6
1
2
3
4
5
n
Instancia 5
Instancia 4
Instancia 3
Instancia 2
Instancia 1
0
1
2
3
4
5
n
factorial(0)
1 * factorial(0)
2 * factorial(1)
3 * factorial(2)
4 * factorial(3)
5 * factorial(4)
n* factorial(n-1)
1
1*1=1
2*1=2
3*2=6
4 * 6 = 24
5 * 24 = 120
factorial
Ejemplo
Dado un nmero natural N, encontrar el dgito ms significativo (el dgito ms a la derecha).
Diagrama de Llaves:
(*Pre: n >= 0 *)
Mas_Sig n
n <=9
Mas_Sig(n)
(*Caso base*)
n <=9
(*Caso Gral*)
Instancia 5
25
257
2574
25743
Instancia 4
Instancia 3
Instancia 2
Instancia 1
2
25
257
2574
25743
N
2
Mas_Sig(2)
Mas_Sig (25)
Mas_Sig(257)
Mas_Sig (2574)
Mas_Sig(N div 10)
Mas_Sig
Fac(n)
Repetir
Hasta
aux > n
Fac prod
(* Pos: Fac = n! *)
MATEMATICA DISCRETA
Fib 1
(*Caso base*)
Fib(n)
(n=0) (n=1)
Ejemplo
El Mximo Comn Divisor entre dos enteros A y B se define formalmente as:
MCD(M,N) N
MCD(N,M)
si M < N
si M es divisible por N: M mod N = 0
MCD(N, M mod N)
en cualquier otro caso
MATEMATICA DISCRETA
Diagrama de Llaves
S/A
m<n
MCD(m,n)
(n <= m) (m mod n = 0)
m<n
MCD MCD(n, m)
MCD
MCD(n, m mod n)
(*Caso Gral*)
S/A
Ejemplo
Leer una cadena de caracteres terminada con un punto y contar la cantidad de letras.
No se deben utilizar otras estructuras como string o array.
Podemos expresarlo as: Contar la cantidad de letras que siguen al caracter actual y luego si este
caracter es una letra incrementar el contador. Primero establezcamos una definicin formal del problema
cantidad de letras
conta = 0
si caracter = .
conta = conta + 1
Diagrama de Llaves
CantLetras
(var conta)
ch ='.'
S/A
(*Caso Base*)
S/A
ch in [A..Z a..z]
ch in [A..Z a..z]
CantLetras(conta)
conta conta + 1
S/A
(*Caso Gral*)
dim = 1
writeln(A[dim])
writeln(A[dim])
Inverso(dim 1, A)
(*Caso Base*)
(*Caso Gral*)
Diagrama de Llaves
BusBin false
central (max + min) div 2
A[central] = x
BusBin
(var A
max,min,x)
BusBin true
S/A
x > A[central] mincentral+1
x >A[central]
maxcentral-1
S/A
BusBin BusBin(A, max, min, x)
(* Pos: BusBin = true si existe el elemento x BusBin = false si no existe el
elemento x *)
10
MATEMATICA DISCRETA
MoverDiscoBase(n, Torre_A, Torre_C);
Hanoi(n-1, Torre_B, Torre_C, Torre_A)
end
end;
El procedimiento resultante es sencillo y pensar el problema de manera iterativa no hubiese sido
natural de acuerdo al razonamiento efectuado adems de la complejidad de programacin que originara.
Su implementacin de Hanoi
#include <iostream.h>
#include<conio.h>
void torres(int,char,char,char);
void main(){
int n;
clrscr();
cout<<"ingrese un nro entero menor que 11: ";
cin>>n;
if (n<=10)
torres(n,'A','C','B');
else
cout<<"Numero ingresado demasiado grande";
}
void torres(int n,char del_poste,char al_poste, char aux_poste){
if (n==1){
cout<<"\n Mover disco 1 del poste "<<del_poste<<" al poste "<<al_poste;
return ;
}
torres(n-1,del_poste,aux_poste,al_poste);
cout<<"\n Mover disco "<<n<<" del poste "<<del_poste<<" al poste "<<al_poste;
torres(n-1,aux_poste,al_poste,del_poste);
}
FUNCIONES RECURSIVAS FACTORIAL
#include<iostream.h>
#include<math.h>
#include<stdio.h>
unsigned long factorial (int n);
void main()
{
int numero, r;
float resp;
unsigned long fact;
cout<<"Ingrese el numero: ";cin>>numero;
cout<<"Ingrese el valor de r: ";cin>>r;
fact = factorial(numero);
cout<<"La operacion resulta: "<<resp;
}
unsigned long factorial (int n)
{
if (n==0)
return 1;
else
return n*factorial (n-1);
11
MATEMATICA DISCRETA