La ricorsione non è richiesta, ma è uno dei modi più chiari per fare livelli sconosciuti di cicli annidati. Nella tupla di input userai solo un livello di stack per elemento, quindi avrai un bel po 'di respiro.
Per una funzione ricorsiva è necessario un caso base e un caso ricorsivo. Il caso base è quando nella tua tupla hai zero elementi, che è dove stampi il risultato. Il caso ricorsivo è dove esegui ogni ciclo annidato e aggiungi i risultati al livello seguente.
def combineRanges(maxValues, result=()):
if len(maxValues) is 0:
print("-".join(result))
return
for x in range(0, maxValues[0]):
combineRanges(maxValues[1:], result + (str(x),))
Ogni chiamata ricorsiva estrae un elemento dalla parte anteriore di maxValues
e aggiunge un risultato alla tupla result
, finché maxValues
non è vuota. Questo tipo di ricorsione è un po 'più complicato perché stai accumulando il risultato in una discussione, ma questo schema è molto utile e si presenta molto, quindi vale la pena imparare. Inoltre, gli elenchi di python non sono immutabili, motivo per cui uso una tupla per contenere il risultato.