Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
propia definición. Siendo un poco más precisos, y para evitar el aparente círculo sin fin en esta
definición:
Un problema que pueda ser definido en función de su tamaño, sea este N, pueda ser dividido en
instancias más pequeñas (< N) del mismo problema y se conozca la solución explícita a las
instancias más simples, lo que se conoce como casos base, se puede aplicar inducción sobre las
llamadas más pequeñas y suponer que estas quedan resueltas.
Factorial(x: Entero): Sea N := x el tamaño del problema, podemos definir el problema de
forma recurrente como x*Factorial(x - 1); como el tamaño de Factorial(x - 1) es menor que
N podemos aplicar inducción por lo que disponemos del resultado. El caso base es el
Factorial(0) que es 1.
Ordenación por fusión(v: vector): Sea N := tamaño(v), podemos separar el vector en dos
mitades. Estas dos mitades tienen tamaño N/2 por lo que por inducción podemos aplicar
la ordenación en estos dos subproblemas. Una vez tenemos ambas mitades ordenadas
simplemente debemos fusionarlas. El caso base es ordenar un vector de 0 elementos, que
está trivialmente ordenado y no hay que hacer nada.
En estos ejemplos podemos observar como un problema se divide en varias (>= 1) instancias del
mismo problema, pero de tamaño menor gracias a lo cual se puede aplicar inducción, llegando a
un punto donde se conoce el resultado (el caso base)..
Nota: aunque los términos "recursión" y "recursividad" son ampliamente empleados en el campo
de la informática, el término correcto en castellano es recurrencia. Sin embargo este último
término es algo más específico. Véase relación de recurrencia.
Contenido
[ocultar]
3 Algoritmo recursivo
4 Ejemplos de recurrencias
5 Véase también
6 Enlaces externos
a) 0 pertenece a N
Aquellas funciones cuyo dominio puede ser recursivamente definido pueden ser definidas de
forma recurrente.
Veamos cómo se usa esta definición para hallar el valor del factorial de 3:
3! = 3 · (3-1)!
= 3 · 2!
= 3 · 2 · (2-1)!
= 3 · 2 · 1!
= 3 · 2 · 1 · (1-1)!
= 3 · 2 · 1 · 0!
=3·2·1·1
=6
int factorial(int x)
if (x > -1 && x < 2) return 1; // Cuando -1 < x < 2 devolvemos 1 puesto que 0! = 1 y 1! = 1
[En este punto tenemos el factorial de 1 por lo que volvemos marcha atrás resolviendo todos
los resultados]
fact(0,1):-!.
c) Se plantea
d) Debemos tener como dato los valores de los dos primeros términos de la sucesión: y
. Utilizando estos datos ordenamos el sistema de 2x2:
La resolución de este sistema nos da como resultado los valores y , que son números reales
conocidos.
La recursividad es una técnica de programación importante. Se utiliza para realizar una llamada a
una funcion desde la misma funcion. Como ejemplo útil se puede presentar el calculo de números
factoriales. Él factorial de 0 es, por definición, 1. Los factoriales de números mayores se calculan
mediante la multiplicación de 1 * 2 * …, incrementando el número de 1 en 1 hasta llegar al
número para el que se está calculando el factorial.
El siguiente parrafo muestra una función, expresada con palabras, que calcula un factorial.
“Si el número es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero.
Si el número es cero, su factorial es uno. Si el número es mayor que cero, se multiplica por él
factorial del número menor inmediato.”
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.
Supongamos que P es un procedimiento que contiene una sentencia de Llamada a si mismo o una
sentencia de Llamada a un segundo procedimiento que puede eventualmente llamar de vuelta al
procedimiento original P. Entonces P se dice que es u procedimiento recursivo. Como el progrma
no ha de continuar ejecutandose indefinidamente, un procedimiento recursivo ha de tener las dos
siguientes propiedades:
(1) Debe existir un cierto criterio, llamado criterio base, por el que el procedimiento no se llama asi
mismo.
(2) Cada vez que el procedimiento se llame a si mismo(directa o inderectamente), debe estar mas
cerca del criterio base.
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.
Directa: Cuando un subprograma se llama a si mismo una o mas veces directamente. Indirecta:
Cuando se definen una serie de subprogramas usándose unos a otros.
Características.
Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y un acondición
de terminación. La parte recursiva y la condición de terminación siempre existen. En cambio la
parte no recursiva puede coincidir con la condición de terminación. Algo muy importante a tener
en cuenta cuando usemos la recursividad es que es necesario asegurarnos que llega un momento
en que no hacemos más llamadas recursivas. Si no se cumple esta condición el programa no
parará nunca.
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 Recursividad()
InitializeComponent();
double r;
int fin = 0;
fin = int.Parse(textBox4.Text.ToString());
listBox1.Items.Clear();
listBox1.Items.Add("x\ty");
evaluar();
}
//Procedimiento recusivo
fin++;
evaluar();