Sunteți pe pagina 1din 6

INSTITUTO TECNOLGICO DE OAXACA

MATERIA: Estructura de Datos CATEDRTICO: Lic. Anayansi Cristina Hernndez TRABAJO:

Programas Recursivos
NOMBRE DE LA ALUMNA: Snchez Garca Diony Shurianeth GRUPO: ISJ NMERO DE CONTROL: 09161289

FECHA: Lunes, 10 de Octubre de 2011

1- Dado el siguiente fragmento de cdigo static final double N = 2; static final double PREC = 1e-6; static double f (double x) {return x*x-N;} static double bisect (double min, double max) { double med = (min+max)/2; if (max-min<PREC) { return med;} else if (f(min)*f(med)<0) { return bisect (min,med); } else { returnbisect (med,max); } } a) Qu calcula la llamada a la funcin recursiva bisect(0,N)? la media b) Si cambiamos el valor de N, qu estaramos calculando? la media c) Y si cambisemos la funcin f(x)? an se seguira calculando la media. 2. Dado el siguiente algoritmo recursivo: void f(intnum, int div) { if (num>1) { if ((num%div) == 0) { System.out.println(div); f(num/div,div); } else { f(num,div+1); }}} a) Dado un nmero cualquiera x, qu nos muestra por pantalla la llamada a la funcin recursiva f(x,2)? b)Cul sera un nombre ms adecuado para la funcin f? c) Implemente un algoritmo iterativo equivalente

3- Implemente, tanto de forma recursiva como de forma iterativa, una funcin que nosdevuelva el mximo comn divisor de dos nmeros enteros utilizando el algoritmo deEuclides. ALGORITMO DE EUCLIDES Dados dos nmeros enteros positivos m y n, tal que m > n,para encontrar su mximo comn divisor(es decir, el mayor entero positivo que divide a ambos): - Dividir m por n para obtener el resto r (0 r < n) - Si r = 0, el MCD es n. - Si no, el mximo comn divisor es MCD(n,r).

Recursiva: public class mcd { public static intMcd(int a, int b) { if (b==0) // caso base cuando el resto sea 0 return a; else //llamamos al metodopasandole el resto de la division returnMcd(b, a%b); } public static void main(String []args) { int f=Mcd(27,18); System.out.println("el valor es "+f); } }

Iterativo: public class mcd_iterativo { public static int mcd(int a, int b) { while (a!=b) { if (a>b) a= a-b; else b= b-a; } return a; } public static void main(String []args) { int f=mcd(64,16); System.out.println("el valor es "+f); }}

4- Problema de las 8 reinas: Se trata de buscar la forma de colocar 8 reinas en un tablerode ajedrez de forma que ninguna de ellas amenace ni se vea amenazada por otra reina. Algoritmo: - Colocar la reina i en la primera casilla vlida de la fila i - Si una reina no puede llegar a colocarse en ninguna casilla, se vuelve atrs y se cambia la posicin de la reina i-1 - Intentar colocar las reinas restantes en las filas que quedan import java.io.*; public class Reinas { finalboolean available=true ; finalintcuadro=4, norm=cuadro-1 ; int [] posFil=new int[cuadro]; boolean [] columna=new boolean[cuadro]; boolean[] diagonalIzq=new boolean[cuadro*2-1]; boolean[] diagonalDer=new boolean[cuadro*2-1]; intcant=0; Reinas() { for (int i=0; i<cuadro;i++) { posFil[i]=-1; columna[i]=available; } for (int i=0;i<cuadro*2-1;i++) diagonalIzq[i]=diagonalDer[i]=available; } voidPrintBoard(PrintStream out){ } voidponerReina(intfila){ for (int col=0; col<cuadro;col++) if(columna[col]==available &&diagonalIzq[fila+col]==available &&diagonalDer[filacol+norm]==available) { posFil[fila]=col; columna[col]=!available; diagonalIzq[fila+col]=!available; diagonalDer[fila-col+norm]=!available; if (fila<cuadro-1) ponerReina(fila+1); else PrintBoard(System.out); columna[col]=available; diagonalIzq[fila+col]=available;

diagonalDer[fila-col+norm]=available; } } static public void main (String args[]) { Reinas reinas=new Reinas(); reinas.ponerReina(0); System.out.println(reinas.cant + " soluciones encontradas."); } } 5.- Salida de un laberinto: Se trata de encontrar un camino que nos permita salir de unlaberinto definido en una matriz NxN. Para movernos por el laberinto, slo podemospasar de una casilla a otra que sea adyacente a la primera y no est marcada como unacasilla prohibida (esto es, las casillas prohibidas determinan las paredes que forman ellaberinto). Algoritmo: - Se comienza en la casilla (0,0) y se termina en la casilla (N-1,N-1) - Nos movemos a una celda adyacente si esto es posible. - Cuando llegamos a una situacin en la que no podemos realizar ningn movimiento que nos lleve a una celda que no hayamos visitado ya, retrocedemos sobre nuestros pasos y buscamos un camino alternativo. importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; classLaberinto extends JFrame implements ActionListener { JLabel[][] l; JButton b1; JButton b2; booleansalida; Laberinto() { setLayout(null); l=new JLabel[10][10]; for(int f=0;f<10;f++) { for(int c=0;c<10;c++) { l[f][c]=new JLabel(); l[f][c].setBounds(20+c*20,50+f*20,20,20); add(l[f][c]); } } b1=new JButton("Recorrer"); b1.setBounds(10,300,100,25); add(b1); b1.addActionListener(this); b2=new JButton("Crear"); b2.setBounds(120,300,100,25); add(b2); b2.addActionListener(this); crear(); }

public void crear() { for(int f=0;f<10;f++) { for(int c=0;c<10;c++) { int a=(int)(Math.random()*4); l[f][c].setForeground(Color.black); if (a==0) l[f][c].setText("1"); else l[f][c].setText("0"); } } l[9][9].setText("s"); l[0][0].setText("0"); } public void recorrer(intfil,int col) { if (fil>=0 && fil<10 && col>=0 && col<10 && salida==false) { if (l[fil][col].getText().equals("s")) salida=true; else if (l[fil][col].getText().equals("0")) { l[fil][col].setText("9"); l[fil][col].setForeground(Color.red); recorrer(fil,col+1); recorrer(fil+1,col); recorrer(fil-1,col); recorrer(fil,col-1); } } } public void actionPerformed(ActionEvent e) { if (e.getSource()==b1) { salida=false; recorrer(0,0); if (salida) setTitle("tienesalida"); else setTitle("no tienesalida"); } if (e.getSource()==b2) crear(); } public static void main(String[] ar) { Laberinto l=new Laberinto(); l.setBounds(0,0,300,400); l.setVisible(true); }}

S-ar putea să vă placă și