
Miguel Alexander Vásquez Ortega
PreguntaSaludos,
Comprendo como a de funcionar el algoritmo de busqueda exhaustiva, pero no se me ocurre como implementarlo para otros problemas… alguien mas me sigue?

Miguel Alexander Vásquez Ortega
AlejoCm, me encanto tu respuesta a pesar de que creo que no estas utilizando un algoritmo de fuerza bruta como lo son los de busqueda exahustiva o busqueda binaria (explicaste que complicarian el proceso, comprendo), creo que lo que planteaste esta increible y veo tengo que manejar mucha teoria sobre algo si deseo implementar estos algoritmos basicamente. Muchas gracias amigo

Alejandro Cuello Maure
Aqui te dejo un enlace, pegas el codigo y lo puedes entender mejor!

Alejandro Cuello Maure
Creo que la forma mas sencilla de resolverlo es usando funciones recursivas (una funcion recursiva es una funcion que se llama asi misma, las funciones recursivas son usadas para realizar procedimientos más "grandes" por cada paso, lo que se nos complicaría hacer lo mismo con un bucle for o un while).
Yo lo implementé asi:
la forma en que funciona es:
por cada paso o llamada que hacemos, comprobamos si la lista no está vacía, si no lo esta.
Hacemos una operacion que concatenará (unirá) el resultado de lo que nos arroje la funciones de la izquierda que vamos a llamar primero y la funcion de la derecha que se llamará despues de la izquierda, recuerda que las funciones recursivas se ejecutan de "atras para adelante", primero llega a la ultimo, despues se devuelve a su "estado anterior"
Entonces, por cada funcion hacemos un juego, tomamos el primer numero de la otra lista (flecha verde) y en la otra llamada no lo tomamos (flecha verde).
y repetimos el mismo paso por cada llamada, cada llamado vamos haciendo la lista más y más pequeña para que en algun momento quede vacía y nos podamos devolver.
Recuerda tambien que primero vamos a resolver la de un lado, terminamos con esa, nos devolvemos y nos metemos a resolver la otra y unimos lo que nos devuelven las dos funciones y asi sucesivamente se sigue devolviendo.
Disculpa si no se ve bien, lo que esta resaltado en amarillo es lo que nos devuelve cada llamada, y despues se une lo de cada "rama" si lo podemos ver así.
Lo que dice el texto si no es legible es: "Conclusion: por cada paso que damos, tomamos el siguiente numero y a la vez no" refieriendose a las dos llamadas por cada llamada.
Al principio es dificil de entender. Pero aqui esta lo bueno de programar que lo dificil se convierte en facil con practica.
Aqui esta el codigo en python:
def obtener_subconjuntos(numero_actual, conjunto): if len(conjunto) > 0: return obtener_subconjuntos(numero_actual, conjunto[1:]) + obtener_subconjuntos(numero_actual + [ conjunto[0] ], conjunto[1:]) return [numero_actual] if __name__ == '__main__': conjunto = [i for i in range(1, 4)] subcojuntos = obtener_subconjuntos([], conjunto) print(subcojuntos)
Si no lo entiendes , vuelvelo a repasar y repasa las funciones recursivas hasta que lo entiendas, y recuerda nunca pares de Aprender ;)

Miguel Alexander Vásquez Ortega
Bien, su ejemplo propuesto creo que es algun tipo de operacio de conjuntos... dado el caso y disculpa mi ignorancia, como crearias un programa que por busqueda exaustiva haga el proceso que recien muestras en tu ejemplo?

Alejandro Cuello Maure
Podemos decir que cuando no conocemos de lleno todas las posibles soluciones, digamos que el patron para reconocer donde implementar la enumeracion exhaustiva es cuando no tenemos una estructura definida y por eso nos vemos en la obligacion de generar todas las combinaciones posibles.
Un ejemplo es visualizar todas las posibles combinaciones ade numeros en una lista de numeros:
[1,2,3] => [[1], [2], [3], [1,2,3], [1,2], [1,3], [2,3]]
Ahora podemos darle casos mas utiles, como simular eventos, simular posibles casos o alternativas para tomar la mejor decisión.