Determine todas las combinaciones de lanzar una moneda sin usar "itertools.product"

Revisé publicaciones similares en el foro, pero todas sugieren usaritertools.product pero me preguntaba si se puede resolver sin usarlo.

Quiero imprimir todas las combinaciones de resultados para N lanzamientos de una moneda. Esto se puede hacer si N se conoce de antemano. Entonces, el número de bucles anidados será solo N. Pero si N tiene que determinarse dinámicamente (input() función) entonces estoy atascado en implementarlo en código. En inglés simple, es fácil imaginar que el número de bucles for es proporcional a N, pero ¿cómo lo implemento? ¿Tengo que usar lambdas o recursividad? A continuación se muestra como código de ejemplo para N = 4.

results = ["H", "T"]
outcomes = []
for l1 in results:
    for l2 in results:
        for l3 in results:
            for l4 in results:
                outcomes.append(l1+l2+l3+l4)

for o in outcomes:
    print(o)  

Gracias por adelantado.