Documente Academic
Documente Profesional
Documente Cultură
Para calcular el factorial de cualquier número mayor que cero hay que
calcular como mínimo el factorial de otro número. La función que se utiliza es la
función en la que se encuentra en estos momentos, esta función debe llamarse a
sí misma para el número menor inmediato, para poder ejecutarse en el número
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.
Características.
Ventajas e inconvenientes.
La principal ventaja es la simplicidad de comprensión y su gran potencia,
favoreciendo la resolución de problemas de manera natural, sencilla y elegante; y
facilidad para comprobar y convencerse de que la solución 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();
}
}
}
}
Mecánica de recursión.
Un objeto recursivo es aquel que forma parte de si mismo. Esta idea puede
servir de ayuda para la definición de conceptos matematicos. Asi, la definición del
conjunto de los numeros naturles es aque conjunto en el que se cumplen las
siguientes caracteristicas:
• 0 es un número natural.
• El siguiente número de un número natural es otro numero natural.
Recursión directa.
Cuando la función F involucra una función G que invoca a la ves una función
H, y así sucesivamente, hasta que se involucra la función 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 continuación se expone otro ejemplo de programa que utiliza recursión
indirecta, y nos dice si un número es par o impar. Cabe mencionar que existen
otros métodos mucho más sencillos para determinar la solución a este problema,
basta con determinar el resto de la división 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 continúa hasta que el método detecta la forma más simple del
problema, en cuyo caso el método simplemente retorna, posiblemente con un
valor, si el tipo de retorno del método no es void. La pila de llamadas a método
empieza a desbobinarse como una llamada a método anidada para ayudar a
completar una evaluación de expresión. En algún punto, la llamada el método
original se completa, y posiblemente se devuelve un valor.
Recursión infinita
Algoritmo para trasladar la torre 1…n del poste X al poste Z, usando como
auxiliar el poste Y.
Se cumple para n = 1
M3(1) = 1 = 21−1.
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,
más un movimiento del disco n+1. Así que M3(n+1) = 2 × M3(n) + 1 = 2 × (2n−1) +
1 = 2n+1−2+1 = 2n+1−1.
Los algoritmos recursivos funcionan bien con ordenadores, pero son difíciles
de aplicar para un ser humano. Si intentas resolver la torre de ocho discos
aplicando el método descrito es fácil que te pierdas a no ser que vayas tomando
notas de por dónde vas. Incluso para los ordenadores los algoritmos recursivos
suelen ser «poco económicos», en el sentido de que consumen bastante memoria
(y es que ellos también 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 más
complicada que la versión 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 continuación 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());
}
}
}
Diseño
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());
}
}
}
Diseño Explicacion
Recursividad en diseño.
NOTA: Estos son dos ejemplos en ambos utilizamos una condición, pero se
pueden utilizar ciclos siempre asegurándonos de que nos den salida en algún
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 método, y al no
cumplirse debe apuntar al siguiente paso en el procedimiento o al final o
viceversa.
Ejemplo:
Seudocódigo:
1. Creamos la forma que contendrá una listbox para despliegue.
2. Creamos el arreglo que contendrá los elementos (vocales)
3. Después creamos el método 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 método despliegue.
4. En el constructor mandamos llamar al método despliegue.
FUNCIÓN Factorial(n)
INICIO
SI (n<2) ENTONCES
Factorial = 1;
SINO
Factorial = n * Factorial(n-1);
FIN-SI
FIN