Questa soluzione di loop è possibile con la ricorsione?

2

Alla fine, vorrei generalizzare queste soluzioni per lavorare con una tupla di qualsiasi lunghezza. Penso che la ricorsione sia necessaria per questo, ma non sono stato in grado di farlo.

def combineRanges(maxValues) :
    for x in range(0, maxValues[0]) :
        for y in range(0, maxValues[1]) :
            for z in range(0, maxValues[2]) :
                print (str(x) + '-' + str(y) + '-' + str(z));

m = (6,9,20);    
combineRanges(m);

link

    
posta Shaun Luttin 12.08.2014 - 18:18
fonte

2 risposte

6

Non c'è bisogno di ricorrere qui; puoi utilizzare itertools.product , map e tupla decompressione:

from itertools import product

def combine_ranges(max_values):
    for t in product(*map(range, max_values)):
        print("-".join(map(str, t)))

Un esempio più breve:

>>> combine_ranges((2, 2, 2, 2))
0-0-0-0
0-0-0-1
0-0-1-0
0-0-1-1
0-1-0-0
0-1-0-1
0-1-1-0
0-1-1-1
1-0-0-0
1-0-0-1
1-0-1-0
1-0-1-1
1-1-0-0
1-1-0-1
1-1-1-0
1-1-1-1

Notare l'uso dei PEP-8 - nomi conformi.

    
risposta data 12.08.2014 - 18:29
fonte
1

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.

    
risposta data 12.08.2014 - 20:08
fonte

Leggi altre domande sui tag