¿Cuál es un ejemplo de un algoritmo iterativo que se ejecuta en [matemáticas] O (2 ^ n) [/ matemáticas]?

La solución al rompecabezas de la Torre de Hanoi consiste en [matemáticas] 2 ^ n-1 [/ matemáticas] pasos.

Hay algoritmos iterativos que producen tales soluciones. La página de Wikipedia mencionada anteriormente enumera algunos de ellos. A continuación se muestra mi implementación de uno de estos algoritmos iterativos:

N = 5
torres = [lista (rango (N, -1, -1)), [N], [N]]
para clavija en torres: imprimir (clavija [1:])

para escalones (1, 2 ** N):
si paso% 2 == 1:
# el disco más pequeño mueve una clavija a la derecha
i = (paso // 2)% 3
torres [(i + 1)% 3] .append (torres [i] .pop ())
más:
# el único movimiento que no involucra el disco más pequeño
para i, j en [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)]:
si 0 <torres [i] [- 1] <torres [j] [- 1]:
torres [j] .append (torres [i] .pop ())
descanso
imprimir (paso)
para clavija en torres: imprimir (clavija [1:])

(Además, técnicamente, “QuickSort” también sería una respuesta válida a su pregunta, ya que big-O solo representa un límite superior. Pero eso no es lo que quería preguntar, ¿verdad? 😉)

Generar todo lo posible es el algoritmo O (2 ^ N). Para generar todos los subconjuntos posibles de n elementos, simplemente repita el número entero o (2 ^ N) -1. Luego, cada iteración verifica la máscara binaria del número entero, será un subconjunto.
Aquí está la implementación: Power Set – GeeksforGeeks

Puede hacerlo simplemente manteniendo una máscara e iterando sobre ella. Por ejemplo –

para (máscara = 1; máscara <= (1 << n); máscara ++)
// Haz lo que sea necesario

Este bucle for iterará (2 ^ n) veces. (1 << n) es igual al desplazamiento a la izquierda 1 n veces, lo que equivale a (2 ^ n). A ver si eso ayuda.

EDITAR: No es una respuesta a la pregunta, como señala Michal Forišek (gracias).

La respuesta obvia es un algoritmo que genera el conjunto de potencia de un conjunto de entrada dado.

Coloque el conjunto de entrada en una matriz, repita i de 0 a 2 ^ n-1. Cada iteración: para 0