Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructura de datos
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Índice Pág.
1
1. Algoritmos recursivos
3
1.1 Objetivo
3
1.2 Introducción
7
1.3 Función Factorial
13
1.4 Función de Ackerman
21
1.5 Torres de Hanoi
28
1.6 Recorrido de la pieza caballo
42
1.7 Ejercicios de aplicación
43
1.8 Bibliografía
2
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Objetivo
Entender el concepto de recursividad y diseñar y desarrollar programas en lenguaje
C++ y Python que utilicen recursividad para ser aplicados en algoritmos inteligentes.
Introducción
En ciencias de la computación, es una forma de reducir y solventar problemas.
De hecho, recursión es una de las ideas centrales de ciencia de computación.
Resolver un problema mediante recursión significa que la solución depende de
las soluciones de pequeñas instancias del mismo problema.
3
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
1. Algoritmos recursivos
Existen dos maneras de que un algoritmo sea recursivo: directa e indirecta.
La recursión directa se da cuando el algoritmo se define y se llama a si mismo.
La recursión indirecta ocurre cuando un algoritmo A, llama a un algoritmo B y
viceversa, esto puede extenderse para más de dos algoritmos. En este curso, se
tratará solo el primer caso.
Recursividad
La recursividad o recursión es una propiedad que puede tener una función de
llamarse a sí misma bien sea directamente o mediante otra función. La
recursividad se puede utilizar como una solución alternativa a la iteración.
Una solución recursiva a un problema de computación, es por lo general
menos eficiente en términos de tiempo de computadora que una solución
utilizando iteraciones. Sin embargo, en muchas ocasiones el uso de la recursión
permite a los programadores específicar soluciones más naturales, intuitivas y
sencillas que en caso contrario serían más díficiles de resolver. Por esta razón,
la recursividad representa una herramienta poderosa e importante en la
resolución de problemas de computación.
En términos generales, si por ejemplo se tienen dos funciones: funcion1 y
funcion2. La organización de un programa con funciones no recursivas podría
ser:
Funcion_1(parametros)
{
Linea 1
Linea 2
Linea n
}
Funcion_2(parametros)
{
Funcion_1(parametros);
}
Funcion_1(parametros)
{
4
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
funcion1(parametros);
}
Así, la definición recursiva de una función F(n) debe incluir un componente base
(condición de salida) en el que la función F(n) se defina directamente (en otras
palabras, no de manera recursiva) para uno o más valores de n.
Hay problemas que aparecen más naturales con iteraciones y otros con
recursividad, por ejemplo, en problemas con contadores y sumatorias lo natural
es la iteración, pero en problemas en los que distinguimos un caso base y uno
general, como factorial, Fibonacci, MCD lo natural es la recursión.
5
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Existe otro factor muy importante a tener en cuenta: la eficiencia. Hay problemas
altamente complejos en lo que es casi imposible aplicar iteración.
Ejemplos:
6
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
7
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
veremos cuáles son las ventajas de usar recursividad sobre algunas estructuras
de control iterativas. Primero veamos en qué consiste la función factorial. El
factorial de un número es la multiplicación de los números que están
comprendidos entre 1 hasta dicho número. Para expresar el factorial se suele
utilizar la notación n!. Así la definición es la siguiente:
n! = 1 x 2 x 3 x 4 x 5 x ... x (n-1) x n.
Estructura de control for: Un bucle for hace que una instrucción o bloque de
instrucciones se repita un número determinado de veces mientras se cumpla la
condición.
zona de inicialización
zona de condición
zona de incremento ó decremento.
8
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
#include
using namespace std;
int main(void){
int i;
int fact=1;
int numero;
cout<<"ingresa un numero: ";
cin>>numero;
if(numero<0) fact =0;
else if(numero==0) fact=1;
else{
for (i = 1; i <= numero; i++){
fac = fact*i;
}
}
cout<<"Factorial de "<
system("pause");
}
9
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
1, para x = 0 o x =1
Factorial(x) =
x * Factorial(x – 1), para x > 1
// Factorial
#include <iostream>
using namespace std;
double FacR(int X) {
if (X < 2) return 1;
return X * FacR(X - 1);
}
int main()
{
int n;
for (;;) {
cout << "Ingresar un entero (salir < 0 o > 20): ";
cin >> n;
if (n < 0 || n > 20) break;
cout << "Factorial(" << n << ") = " << FacR(n) << endl;
}
return 0;
}
10
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
# Factorial.py
def FacR(X):
if X < 2:
return 1
return X * FacR(X - 1)
# Funcion principal:
while 1:
n = int(input('Ingresar un entero (salir < 0 o > 20): '))
if n < 0 or n > 20:
break
print('Factorial(', n, ') = ', FacR(n))
Resultados de la corrida:
11
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
>>>
====== RESTART: C: \EstructuraDeDatos2020\Python\Factorial.py
======
Ingresar un entero (salir < 0 o > 20): 0
Factorial( 0 ) = 1
Ingresar un entero (salir < 0 o > 20): 3
Factorial( 3 ) = 6
Ingresar un entero (salir < 0 o > 20): 5
Factorial( 5 ) = 120
Ingresar un entero (salir < 0 o > 20): 10
Factorial( 10 ) = 3628800
Ingresar un entero (salir < 0 o > 20): 21
>>>
12
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
y + 1, para x = 0 [1]
Ack(x, y) = Ack(x – 1, 1) para y = 0 [2]
Ack(x – 1, Ack(x, y – 1)), para x > 0, y > 0 [3 externa] [3’ interna]
Para x = 1:
Ack(1, 0) = Ack(0, 1) = (1) + 1 = 2
Ack(1, 1) = Ack(0, Ack(1, 0)) = Ack(1, 0) + 1 = (2) + 1 = 3
Ack(1, 2) = Ack(0, Ack(1, 1)) = Ack(1, 1) + 1 = (3) + 1 = 4
…
Por induction:
Ack(1, y) = Ack(0, Ack(1, y-1)) = Ack(1, y-1) + 1 = (y + 1) + 1 = y + 2 [4]
Para x = 2:
Ack(2, 0) = Ack(1, 1) = (1) + 2 = 3
Ack(2, 1) = Ack(1, Ack(2, 0)) = Ack(1, 3) = (3) + 2 = 5
Ack(2, 2) = Ack(1, Acl(2, 1)) = Ack(1, 5) = (5) + 2 = 7
…
Por induction:
Ack(2, y) = Ack(1, Ack(2, y-1)) = Ack(1, 2y + 1) = (2y + 1) + 2 = 2y + 3 [5]
Para x = 3:
Ack(3, 0) = Ack(2, 1) = 2(1) + 3 = 2(0 + 3) – 3 = 5
Ack(3, 1) = Ack(2, Ack(3, 0)) = Ack(2, 2(0 + 3) – 3) = 2(2(0 + 3) – 3) + 3 = 2(1 + 3) – 3
Ack(3, 2) = Ack(2, Ack(3, 1)) = Ack(2, 2(1 + 3) – 3) = 2(2(1 + 3) – 3) + 3 = 2(2 + 3) – 3
…
Por induction:
Ack(3, y) = Ack(2, Ack(3, y-1)) = Ack(2, 2(y + 3) – 3) = 2(2(y-1 + 3) – 3) = 2(y + 3) – 3
[6]
Para x = 4:
2
Ack(4, 0) = Ack(3, 1) = 2(1 + 3) – 3 = 22 − 3 = 24 – 3 = 13
2 2 22
Ack(4, 1) = Ack(3, Ack(4, 0)) = Ack(3,22 − 3) = 2(22 − 3) + 3 = 22 −3
…
Por induction: …
22
Ack(4, y) = Ack(3, Ack(4, y – 1)) = 22 − 3, la exponenciación se extiende (y +
4) veces
Programa en C++:
// Ackermann
#include <iostream>
#define MaxX 4
13
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
#define MaxY 20
using namespace std;
// Prototipos
long Ackermann(long X, long Y);
// Funciones
int main()
{
long X, Y;
for (;;) {
cout << "Ingresar X (salir < 0 o > " << MaxX << "): ";
cin >> X;
if (X < 0 || X > MaxX) break;
cout << "Ingresar Y (salir < 0 o > " << MaxY << "): ";
cin >> Y;
if (Y < 0 || Y > MaxY) break;
cout << "Ackermann(" << X << ", " << Y << ") = " <<
Ackermann(X, Y) << endl;
}
return 0;
}
Resultados de la corrida:
14
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Programa en Python:
# Ackerman.py
MaxX = 4
MaxY = 20
15
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
return Y + 1
elif Y == 0:
return Ack(X - 1, 1)
else:
return Ack(X - 1, Ack(X, Y - 1))
# Funcion principal:
while 1:
x = int(input('Ingresar x (salir < 0 o > ' + str(MaxX)+ '): '))
if x < 0 or x > MaxX:
break
y = int(input('Ingresar y (salir < 0 o > ' + str(MaxY)+ '): '))
if y < 0 or y > MaxY:
break
print('Ackerman(', x, ', ', y, ') = ', Ack(x, y))
16
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
17
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
18
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
19
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Análisis:
Se Plantean dos casos: (1) mover un disco desde el poste izquierdo hacia el
poste derecho y (2) mover tres discos desde el poste izquierdo hacia el poste
derecho, cuya solución grafica es:
20
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Diseño en seudocódigo:
21
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Prueba de escritorio:
22
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Programa en C++:
// TorresHanoi
#include <iostream>
using namespace std;
// Prototipado:
void MoverDiscos(int, int, int, int);
void PasarDisco(int, int, int);
void EscribirPoste(int);
// Definicion de funciones:
int main()
{
int n, origen, destino;
while (1) {
cout << "Ingresar el numero de discos (salir < 1 o > 10): ";
cin >> n;
if (n < 1 || n > 10) break;
cout << "Ingresar el poste origen:\n";
cout << "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): ";
cin >> origen;
if (origen < 0 || origen > 2) break;
cout << "Ingresar el poste destino:\n";
cout << "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): ";
cin >> destino;
if (destino < 0 || destino > 2 || origen == destino) break;
cout << "Secuencia de pasos para mover " << n << " discos desde el
poste ";
EscribirPoste(origen);
cout <<" hacia el poste ";
EscribirPoste(destino);
cout << endl;
MoverDiscos(n, origen, destino, 3 - origen - destino);
cout << endl;
}
return 0;
}
23
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
void EscribirPoste(int p) {
switch (p) {
case 0: cout << "izquierdo"; break;
case 1: cout << "medio"; break;
case 2: cout << "derecho"; break;
}
}
Resultados de la corrida:
24
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Programa en C++:
# TorresHanoi.py
def NomPoste(argument):
Poste = {
0: "Izquierdo",
1: "Medio",
2: "Derecho"
}
return Poste.get(argument, "N/A")
25
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
# Funcion Principal:
while (1):
n = int(input( "Ingresar el numero de discos (salir < 1 o > 10): "))
if (n < 1 or n > 10):
break
print("Ingresar el poste origen:")
origen = int(input( "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): "))
if (origen < 0 or origen > 2):
break
print("Ingresar el poste destino:")
destino = int(input( "0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro
valor): "))
if (destino < 0 or destino > 2 or origen == destino):
break
print( "Secuencia de pasos para mover " + str( n) + " discos desde el poste " +
NomPoste(origen) + " hacia el poste " + NomPoste(destino))
MoverDiscos(n, origen, destino, 3 - origen - destino)
print("")
Resultados de la corrida:
26
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
0 --> Izquierdo, 1 --> Medio, 2 --> derecho (salir --> otro valor): 2
Secuencia de pasos para mover 3 discos desde el poste Izquierdo hacia el poste
Derecho
Pasar el disco 1 desde el poste Izquierdo hacia el poste Derecho
Pasar el disco 2 desde el poste Izquierdo hacia el poste Medio
Pasar el disco 1 desde el poste Derecho hacia el poste Medio
Pasar el disco 3 desde el poste Izquierdo hacia el poste Derecho
Pasar el disco 1 desde el poste Medio hacia el poste Izquierdo
Pasar el disco 2 desde el poste Medio hacia el poste Derecho
Pasar el disco 1 desde el poste Izquierdo hacia el poste Derecho
27
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Análisis:
Los posibles movimientos que puede dar la pieza caballo son, si se considera
que el origen de coordenadas es el punto (2, 2) y se mueve en sentido horario:
28
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Algoritmo en seudocódigo:
Procedimiento Intentar(Este, X, Y)
Inicia Intentar
Inicializar todos los posibles candidatos a movimiento;
Repetir
Calcular la siguiente posición considerando el tipo aleatorio del movimiento (U, V);
Si es aceptable Entonces
Inicia Completar
Anotar el siguiente movimiento;
Si el tablero no se encuentra lleno Entonces
Inicia Avanzar
Intentar(Siguiente, U, V);
Si No ha Terminado el recorrido Entonces
Borrar el siguiente movimiento;
Fin Proceso Avanzar
Caso_contrario
El recorrido ha sido exitoso;
Fin Proceso Completar;
Mientras No haya terminado el recorrido Y existan otros tipos de movimiento;
Fin Procedimiento Intentar;
Prueba de escritorio:
Forman parte de la pila, las variables locales y los parámetros pasados por valor
de la función recursiva.
29
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
#ifndef CALEATORIOS_H
#define CALEATORIOS_H
#include <iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
class CAleatorios
{
public:
int *a, n;
CAleatorios(int n = 0);
void Mostrar();
unsigned Aleatorio(unsigned, unsigned);
virtual ~CAleatorios();
protected:
private:
int Buscar(int, int);
};
#endif // CALEATORIOS_H
#include "CAleatorios.h"
CAleatorios::CAleatorios(int n)
{
//ctor
int pos, alt;
srand((unsigned)time(NULL));
if (n == 0)
return;
this->n = n;
a = new int[n];
for (int i = 0;;) {
alt = Aleatorio(0, n - 1);
pos = Buscar(i, alt);
if (pos < 0) {
a[i] = alt;
i ++;
}
if (i >= n) break;
30
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
}
}
CAleatorios::~CAleatorios()
{
//dtor
delete a;
}
void CAleatorios::Mostrar()
{
for (int i = 0; i < n; i ++)
cout << a[i] << " ";
cout << endl;
}
unsigned CAleatorios::Aleatorio(unsigned A, unsigned B)
{
return (A + abs(rand())%(B-A+1));
}
int CAleatorios::Buscar(int tl, int x)
{
//Buscar
int pos;
for (pos = 0; pos < tl; pos ++)
if (x == a[pos])
return pos;
return -1;
}
Programa en C++:
// MovCaballo
#include <iostream>
#include <CAleatorios.h>
#define MaxTab 8
using namespace std;
// Variables globales
CAleatorios Alt(8);
static int A[] = {2, 1, -1, -2, -2, -1, 1, 2},
B[] = {1, 2, 2, 1, -1, -2, -2, -1};
int Tablero[MaxTab][MaxTab], TerminoRecorrido, DimTab, X0, Y0;
// Prototipos
void Intentar(int I, int X, int Y);
void EscribirResultado();
// Funciones
int main()
31
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
{
while (1) {
cout << "INGRESAR LA DIMENSION DEL TABLERO (DE 3 A " <<
MaxTab << ", SINO SALE): ";
cin >> DimTab;
if (DimTab < 3 || DimTab > MaxTab)
break;
cout << "INGRESAR LAS COORDENADAS INICIALES DEL CABALLO \n";
cout << "PARA SALIR DIGITAR VALORES FUERA DE RANGO: ";
cin >> X0 >> Y0;
if (X0 < 0 || X0 > DimTab || Y0 < 0 || Y0 > DimTab)
break;
EscribirResultado();
}
}
void Intentar(int I, int X, int Y)
{ // Intentar
int U,V,K = -1;
do {
U = X + A[Alt.a[++K]];
V = Y + B[Alt.a[K]];
if (U >= 0 && U < DimTab && V >= 0 && V < DimTab &&
Tablero[U][V] == 0) {
Tablero[U][V] = I;
if (I < DimTab * DimTab ) {
Intentar(I+1,U,V);
if (!TerminoRecorrido)
Tablero[U][V] = 0;
}
else
TerminoRecorrido = 1;
}
}
while (!TerminoRecorrido && K < 7);
} // Intentar;
void EscribirResultado() {
int I, J;
cout << "\nMOVIMIENTOS DEL CABALLO\n"
"DIMENSION DEL TABLERO: " << DimTab << endl <<
"UBICACION INICIAL DEL CABALLO: (" << X0 << ", " << Y0 <<
")\nTIPOS DE MOVIMIENTOS ALEATORIOS:\n";
Alt.Mostrar();
cout << endl;
TerminoRecorrido = 0;
for (I = 0; I < DimTab ; I++)
for (J = 0; J < DimTab; J++)
32
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Tablero[I][J] = 0;
Tablero[X0][Y0] = 1;
Intentar(2, X0, Y0);
if (TerminoRecorrido)
for (I = 0; I < DimTab; I++)
for (J = 0; J < DimTab; J++)
cout << Tablero[I][J] << (J == DimTab - 1 ? "\n" : " ");
else
cout << "NO HAY SOLUCION\n";
cout << endl << endl;
}
Resultados de la corrida:
33
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
34
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
35
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
36
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
# CAleatorios.py
import time
import random
t = int(time.time())
random.seed(t)
class CAleatorios:
def __init__(self, a, n):
self.a = a
self.n = n
37
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
return pos
return -1
def Generar(elm):
i=0
n = elm.n
while (i < n):
alt = elm.Aleatorio(0, n - 1)
pos = elm.Buscar(i, alt)
if pos < 0:
elm.a.append(alt)
i += 1
def Mostrar(elm):
cad = ""
for i in range(elm.n):
cad += str(elm.a[i])+ " "
print(cad)
Programa en Python:
# MovCaballo.py
from ModulosPY.CAleatorios import CAleatorios
def Intentar(I, X, Y):
global TerminoRecorrido
K = -1
while (not TerminoRecorrido and K < 7):
K += 1
Val = alt.GetVal(K)
U = X + A[Val]
V = Y + B[Val]
if (U >= 0 and U < DimTab and V >= 0 and V < DimTab and Tablero[U][V] == 0):
Tablero[U][V] = I
if (I < DimTab * DimTab ):
Intentar(I+1,U,V)
if (not TerminoRecorrido):
Tablero[U][V] = 0
else:
TerminoRecorrido = True
def EscribirResultado():
print( "\nMOVIMIENTOS DEL CABALLO")
print("DIMENSION DEL TABLERO: ", DimTab)
print("UBICACION INICIAL DEL CABALLO: (" , X0, ", ", Y0, ")\nTIPOS DE
MOVIMIENTOS ALEATORIOS:")
38
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
alt.Mostrar()
print("")
for I in range(DimTab):
Tablero.append([])
for J in range(DimTab):
Tablero[I].append(0)
Tablero[X0][Y0] = 1
Intentar(2, X0, Y0)
if (TerminoRecorrido):
for I in range(DimTab):
cad = ""
for J in range(DimTab):
cad += str(Tablero[I][J]) + " "
print(cad)
else:
print("NO HAY SOLUCION")
print("\n")
# Funcion Principal:
MaxTab = 8
alt = CAleatorios([], 8)
alt.Generar()
A = [2, 1, -1, -2, -2, -1, 1, 2]
B = [1, 2, 2, 1, -1, -2, -2, -1]
Tablero = []
TerminoRecorrido = False
DimTab = 0
X0 = 0
Y0 = 0
while (1):
DimTab = int(input( "INGRESAR LA DIMENSION DEL TABLERO (DE 3 A " +
str(MaxTab)+ ", SINO SALE): "))
if (DimTab < 3 or DimTab > MaxTab):
break
print( "INGRESAR LAS COORDENADAS INICIALES DEL CABALLO ")
X0 = int(input( "X0, PARA SALIR DIGITAR VALORES FUERA DE RANGO: "))
Y0 = int(input( "Y0, PARA SALIR DIGITAR VALORES FUERA DE RANGO: "))
if (X0 < 0 or X0 > DimTab or Y0 < 0 or Y0 > DimTab):
break
Tablero = []
TerminoRecorrido = False
EscribirResultado()
39
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Resultados de la corrida:
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit
(Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
============== RESTART:
C:\EstructuraDeDatos2020\Python\MovCaballo.py ==============
INGRESAR LA DIMENSION DEL TABLERO (DE 3 A 8, SINO SALE): 3
INGRESAR LAS COORDENADAS INICIALES DEL CABALLO
X0, PARA SALIR DIGITAR VALORES FUERA DE RANGO: 0
Y0, PARA SALIR DIGITAR VALORES FUERA DE RANGO: 0
NO HAY SOLUCION
NO HAY SOLUCION
40
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
23 12 3 18 25
4 17 24 13 8
11 22 7 2 19
16 5 20 9 14
21 10 15 6 1
25 18 15 34 31 36
16 5 24 3 14 33
19 26 17 32 35 30
6 9 4 23 2 13
27 20 11 8 29 22
10 7 28 21 12 1
41
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
42
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Bibliografía:
1) Niklaus Wirth: Algoritmos + Estructuras de Datos = Programas.
43
Algoritmos Recursivos
Universidad de las Fuerzas Armadas ESPE Unidad de Educación a Distancia
Recursos complementarios:
Los siguientes recursos complementarios son sugerencias para que puedas
ampliar la información sobre el tema trabajado, como parte de un proceso de
aprendizaje autónomo:
https://www.youtube.com/watch?v=0NBPd81uhJE&ab_channel=Programaci%C3%B3n
DesdeCero
44
Algoritmos Recursivos