• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,180
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
16
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Quizás en la teoría cueste más ver lo que es una función recursiva que por la práctica. Unejemplo típico de recursividad sería la función factorial. El factorial es una funciónmatemática que se resuelve multiplicando ese número por todos los números naturales quehay entre él y 1.Por ejemplo, factorial de 4 es igual a 4 * 3 * 2 * 1. Si nos fijamos, para el ejemplo defactorial de 4 (factorial se expresa matemáticamente con un signo de admiración haciaabajo, como 4!), se puede resolver como 4 * 3! (4 * factorial de 3). Es decir, podemoscalcular el factorial de un número multiplicando ese número por factorial de ese númeromenos 1.n! = n * (n-1)!En el caso de la función factorial, tenemos el caso básico que factorial de 1 es igual a 1. Asíque lo podremos utilizar como punto de ruptura de las llamadas recursivas.Así pues, vamos a realizar la codificación de la función recursiva factorial. Primero veamosun pseudocódigo:funcion factorial(n) si n=1 entonces factorial = 1 sino factorial = n * factorial(n-1)fin funcionunciones recursivasVamos a ver como se construye una clase de funciones, llamadas recursivasprimitivas, definidas entre n-uplas de números naturales sobre los númerosnaturales 31, (es decir ), con la idea de caracterizar las funcionesque son efectivamente calculables, es decir, aquellas funciones para las quedada la n-upla de sus argumentos podemos definir un procedimiento paraencontrar en un numero finito de pasos el valor de la función.Usaremos para ello una definición recursiva, es decir, nos apoyaremos en unconjunto de funciones que por definición son recursivas (conjunto inicial quese denomina base de la recursión), y en un conjunto de reglas queaplicándolas a funciones recursivas primitivas ya definidas obtenemos nuevasfunciones recursivas. En nuestro caso la base esta formada por lasfunciones nula, sucesor y proyección, y las reglas que llamamosdecomposición y de recursión primitiva. Estos elementos quedan definidos dela siguiente forma:Base de recursión:Función nula :
  • 2. mediante la que se hace corresponder a cualquier numero natural el numero 0 (borrar el numero).Función sucesor : mediante la cual a cada numero natural se le hace corresponder su sucesor, que denotamos por (encontrar el siguiente).Función proyección : mediante la cual a cada n-upla se le hace corresponder su i-esima componente (elegir uno de una sucesión finita)Reglas:Regla de composición : dadas las funciones y la función que depende de las funciones anteriores, es decir entonces decimos que es la función compuesta de las mediante si está definida de la siguiente forma:Regla de recursion primitiva con parametros: dadas dos funciones recursivas conocidas
  • 3. que dependen de los parámetros , se define la función mediante el siguiente esquema de recursión:Regla de recursion primitiva sin parametros: es un caso particular del anterior en el que no aparecerán los parámetros y el esquema de recursión sería: donde es una función recursiva conocida y es una constante (un numero natural dado).La clase de funciones definidas de esta manera, es una clase de funciones quese puede calcular efectivamente, ya que son construidas a partir un conjuntobase, cuyo cálculo puede ser considerado trivial, y mediante procedimientos oesquemas de cálculo sencillos y que se realizan por pasos sucesivos 32. Seprueba que esta clase de funciones es la misma que la que se define utilizandopara ello las Maquinas de Turing, que describimos a continucion.regunta 2Escriba un programa que sirva para saber las posibilidades de movimiento deun caballo en una partida de ajedréz de una casilla a otra (por ejemplo paracomer una pieza). Para ello se ha creado una matriz A[8][8] la cual contieneun mapa del tablero (0 si la casilla está vacía o 1 si está ocupada) y se debecrear un programa donde ingresando el punto de inicio y el de destino diga siexiste una combinación de movimientos posibles que lo lleven del inicio aldestino sin que pase a través de una casilla ocupada o no. (Problemadifícil!!!!,estudienlo)
  • 4. Solución/* 1 es SI HAY, 0 es NO HAY */intrecorrer(int A[][], int i, int j, int p, int q){if (i<0 || i>=8 || j<0 || j>=8) return false; /* Fuera del tablero */if ((i==p) && (j==q)) return true; /* Mismolugar */if (A[i][j]==1) return false; /* casilla ocupada */A[i][j]=1; /* Ocupo la casilla */ /* Así evito ciclos */return recorrer (A, i-2, j-1, p,q) || recorrer (A, i-2, j+1, p,q) || recorrer (A, i-1, j-2, p,q) || recorrer (A, i-1, j+2, p,q) || recorrer (A, i+1, j-2, p,q) || recorrer (A, i+1, j+2, p,q) || recorrer (A, i+2, j-1, p,q) || recorrer (A, i+2, j+1, p,q);}Pregunta 3Un copo de nieve se puede definir como un punto, varias ramas en círculo quesalen de él y luego un copo de nieve de 1/3 del tamaño anterior en la punta decada una de esas ramas. Las ramas son del mismo tamaño y están dispuestascon el mismo ángulo entre ellas. Se pide escribir una función recursiva:
  • 5. dibuja_arbol(int x, int y, int n, int l, int nivel)Donde (x,y) son las coordenadas del centro; n es el número de ramas; l es ellargo de las ramas y nivel es el número de niveles que quiero (en el últimonivel se dibuja un círculo de radio l). Por ejemplo, del llamadodibuja_arbol(400,300,6,200,4) se obtiene:Para calcular las ramas, deben encontrar el ángulo alfa y las coordenadas delas puntas de todas las ramas, usando seno y coseno del ángulocorrespondiente. Para el caso de 8 ramas se tiene:
  • 6. Para dibujar posee las funciones linea (int x1, int y1, int x2, int y2) que dibujauna línea entre los puntos (x1,y1) y (x2,y2). Y el método circ (int x, int y, intr) que dibuja una circunferencia de centro (x,y) y radio r.Solución#include<math.h>voiddibuja_arbol(int x, int y, int n, int l, int nivel){float alfa = 2*PI/n;if(nivel == 0) { circ(x,y,l); return; }/* Aca se itera con el angulo alfa */for(int i = 0; i < n; i++) { linea(x, y, (int)(x+l*cos(i*alfa)), (int)(y-l*sin(i*alfa))); dibuja_arbol((int)(x+l*cos(i*alfa)),(int)(y-l*Math.(i*alfa)), n, l/3, nivel-1); }}
  • 7. Problemas propuestosProblema 1: Las torres de HanoiSe tienen las torres de Hanoi, en que hay que llevar las n fichas de A hasta C,siempre dejando una ficha mas pequeña sobre otra mas grande. Se puedeutilizar B para pasar algunas fichas. Plantee el algoritmo recursivo que lo realiza.Problema 2: Tratamiento de enterosEscriba una función recursiva que reciba un entero y retorne un String con losdigitos invertidos y separados por *. Por ejemplo:Ingrese un número: 123455*4*3*2*1