Determine todas as combinações de lançar uma moeda sem usar "itertools.product"

Passei por posts semelhantes no fórum, mas todos sugerem o usoitertools.product mas eu queria saber se ele pode ser resolvido sem usá-lo.

Quero imprimir todas as combinações de resultados para N lançamentos de uma moeda. Isso pode ser feito se N for conhecido antecipadamente. Portanto, o número de loops aninhados será apenas N. Mas se N tiver que ser determinado dinamicamente (input() função), então eu estou preso em implementá-lo no código. Em inglês simples, é fácil imaginar que o número de loops for é proporcional a N, mas como o implemento? Eu tenho que usar lambdas ou recursão? Abaixo está como exemplo de código 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)  

Desde já, obrigado.