miércoles, 5 de septiembre de 2012

Recursividad - Ejercicios resueltos 11

No existe una única forma de implementar una función recursiva. Cuando una solución es de tipo procedural puede que la primera acción no sea el "borde", si no una acción concreta, para luego a través de la validación hacer el llamado recursivo.

4.- Confeccione una función recursiva que llene un tablero n-goro. Un tablero n-goro es una matriz de n x n+1 que se llena consecutivamente en diagonal y cada vez que se desborda la continuidad se sigue por la fila o columna desocupada contigua según corresponda:

1
17
13
9
5
6
2
18
14
10
11
7
3
19
15
16
12
8
4
20

Empezamos inmediatamente a llenar la matriz empezando por la primera posición y continuamos por la diagonal (posiciones 0,0 1,1 2,2 3,3 ... etc).

Borde: Si i=n y j=n+1, quiere decir que llegamos a la última posición de la matriz y podemos imprimir.

Si no es así, debemos revisar si la i (filas) excedió la última posición y debemos mantener el número que queríamos colocar y la posición de la columna pero cambiar la fila por la 0 (empezar de arriba de nuevo).

También debemos validar que la j no exceda n+1, lo que significará que se habrá pasado de la última columna y en ese caso, mantenemos la fila y el número para cambiar la j por 0 (primera columna).

La implementación en Java es la siguiente:

public void nGoro(int i, int j, int paso){
 /*************************************
  * Si se mantiene dentro del tablero,*
  * llenar la posición con el valor   *
  * en la recursión y continuar por la*
  * posición en diagonal.             *
  *************************************/
 
 if( estaDentro(i,j) ){
  T[i][j] = paso;
  nGoro(i+1, j+1, paso + 1);
 }
 /****************************************
  * BORDE:                               *
  * Si se ha llegado a la última posición*
  * se imprime y no hace nada más        *
  ****************************************/
 else if( (i==N) && (j==N+1))
   imprimir( );
 
 /****************************************
  * Si    se ha pasado de la última fila *
  * conservar número y columna y recurrir*
  * por la primera fila                  *
  ****************************************/
 else if ( i == N )
  nGoro(0, j, paso);
  
 /****************************************
  * Si se excede la última columna se    *
  * conserva el número y la fila y se    *
  * recurre por la primera columna.      *
  ****************************************/
 else if ( j == N+1 )
  nGoro(i, 0, paso);
}

No hay comentarios:

Publicar un comentario