Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2 Recursividad PDF
2 Recursividad PDF
Para calcular el factorial de cualquier nmero mayor que cero hay que
calcular como mnimo el factorial de otro nmero. La funcin que se utiliza es la
funcin en la que se encuentra en estos momentos, esta funcin debe llamarse a
s misma para el nmero menor inmediato, para poder ejecutarse en el nmero
actual. Esto es un ejemplo de recursividad.
Un procedimiento recursivo con estas dos propiedades se dice que esta bien
definido.
Similarmente, una funcion se dice que esta definida recursivamente si la
definicion de la funcion se refiere a si misma. De nuevo, para que la definicion no
sea circular, debe tener las dos siguientes propiedades:
(1) Debe haber ciertos argumentos, llamados valores base, para los que la
funcion no se refiera a si misma.
(2) Cada vez que la funcion se refiera a si misma, el argumento de la funcion
debe acercarse mas al valor base.
Una funcion recursiva con estas dos propiedades se dice tambien que esta
bien definida.
Tipos.
Caractersticas.
Ventajas e inconvenientes.
La principal ventaja es la simplicidad de comprensin y su gran potencia,
favoreciendo la resolucin de problemas de manera natural, sencilla y elegante; y
facilidad para comprobar y convencerse de que la solucin del problema es
correcta. El principal inconveniente es la ineficiencia tanto en tiempo como en
memoria, dado que para permitir su uso es necesario transformar el programa
recursivo en otro iterativo, que utiliza bucles y pilas para almacenar las variables.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Recursividad : Form
{
public Recursividad()
{
InitializeComponent();
}
double r;
int fin = 0;
private void button1_Click(object sender, EventArgs e)
{
fin = int.Parse(textBox4.Text.ToString());
listBox1.Items.Clear();
listBox1.Items.Add("x\ty");
evaluar();
}
//Procedimiento recusivo
public void evaluar()
{
while (fin <= int.Parse(textBox5.Text.ToString()))
{
r = int.Parse(textBox1.Text.ToString()) * (fin * fin) +
int.Parse(textBox2.Text.ToString()) * fin +
int.Parse(textBox3.Text.ToString());
listBox1.Items.Add(fin.ToString() + "\t" + r.ToString());
fin++;
evaluar();
}
}
}
}
Mecnica de recursin.
Un objeto recursivo es aquel que forma parte de si mismo. Esta idea puede
servir de ayuda para la definicin de conceptos matematicos. Asi, la definicin del
conjunto de los numeros naturles es aque conjunto en el que se cumplen las
siguientes caracteristicas:
0 es un nmero natural.
El siguiente nmero de un nmero natural es otro numero natural.
Recursin directa.
Cuando la funcin F involucra una funcin G que invoca a la ves una funcin
H, y as sucesivamente, hasta que se involucra la funcin F. Por ejemplo el
algoritmo de Par o impar.
return impar(n-1);
int impar(int n)
if (n==0) return 0;
return par(n-1);
}
A continuacin se expone otro ejemplo de programa que utiliza recursin
indirecta, y nos dice si un nmero es par o impar. Cabe mencionar que existen
otros mtodos mucho ms sencillos para determinar la solucin a este problema,
basta con determinar el resto de la divisin entre dos. Por ejemplo: si hacemos
par(2) devuelve 1 (cierto). Si hacemos impar (4) devuelve 0 (falso).
int par(int n)
{ if (n == 0) return 1;
return impar(n-1);
}
int impar(int n)
{ if (n == 0) return 0;
return par(n-1);
}
int fibo(int n)
{ if (n<=1) return 1
Esta actividad contina hasta que el mtodo detecta la forma ms simple del
problema, en cuyo caso el mtodo simplemente retorna, posiblemente con un
valor, si el tipo de retorno del mtodo no es void. La pila de llamadas a mtodo
empieza a desbobinarse como una llamada a mtodo anidada para ayudar a
completar una evaluacin de expresin. En algn punto, la llamada el mtodo
original se completa, y posiblemente se devuelve un valor.
Recursin infinita
Se cumple para n = 1
M3(1) = 1 = 211.
Si se cumple para n, se cumple para d+1
Al ejecutarse el algoritmo para n+1 se llama a s mismo dos veces para n,
ms un movimiento del disco n+1. As que M3(n+1) = 2 M3(n) + 1 = 2 (2n1) +
1 = 2n+12+1 = 2n+11.
Los algoritmos recursivos funcionan bien con ordenadores, pero son difciles
de aplicar para un ser humano. Si intentas resolver la torre de ocho discos
aplicando el mtodo descrito es fcil que te pierdas a no ser que vayas tomando
notas de por dnde vas. Incluso para los ordenadores los algoritmos recursivos
suelen ser poco econmicos, en el sentido de que consumen bastante memoria
(y es que ellos tambin necesitan tomar notas). La alternativa a los algoritmos
recursivos son los iterativos, en los que no hay llamadas a s mismo, sino uno o
varios bucles. Muy a menudo no existe o no se conoce una alternativa iterativa
para un algoritmo recursivo, y cuando s se conoce, suele ser mucho ms
complicada que la versin recursiva. Sin embargo, en el caso de la Torre de
Hanoi, existen varios algoritmos iterativos muy simples.
El N 0 es natural
El N n es natural si n-1 lo es
Es un caso donde el problema puede resolverse sin tener que hacer uso de
una nueva llamada a s mismo. Evita la continuacin indefinida de las partes
recursivas.
Codigo Recursivo
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
class cap_recursivo
{
public Form1()
{
InitializeComponent();
{
cap sayo = new cap();
label4.Text = int.Parse(sayo.capital());
}
}
}
Diseo
Codigo Iterativo
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication7
{
public partial class Form1 : Form
{
class cap
{
public float capital(float m, int n, float x)
{
if (n == 0)
{ return m; }
else
{
//x = x / 100;float inn;
//x = x * m;
x = x / 100;
}
}
public Form1()
{
InitializeComponent();
}
label4.Text = int.Parse(sayo.capital());
}
}
}
Diseo Explicacion
Recursividad en diseo.
NOTA: Estos son dos ejemplos en ambos utilizamos una condicin, pero se
pueden utilizar ciclos siempre asegurndonos de que nos den salida en algn
momento.
Lo importante y que tenemos que tomar en cuenta es que la si se cumple el
criterio para llamar el procedimiento hay que apuntar a el inicio del mtodo, y al no
cumplirse debe apuntar al siguiente paso en el procedimiento o al final o
viceversa.
Ejemplo:
Seudocdigo:
1. Creamos la forma que contendr una listbox para despliegue.
2. Creamos el arreglo que contendr los elementos (vocales)
3. Despus creamos el mtodo despliegue. El cual contendr:
a. Un ciclo for (int i=0;i 4;i++) dentro del cual se har el despliegue en el
ndice i del arreglo vocales
b. llamar al mtodo despliegue.
4. En el constructor mandamos llamar al mtodo despliegue.
FUNCIN Factorial(n)
INICIO
SI (n<2) ENTONCES
Factorial = 1;
SINO
Factorial = n * Factorial(n-1);
FIN-SI
FIN