2012-02-07 20 views
7

ho fatto riferimento a diverse domande qui circa la ricorsione, ma io non sono in grado di capire come la ricorsione funziona per questo particolare problema: programma ricorsivo per ottenere tutte le combinazioni di caratteri di una stringa in Python:La comprensione e la visualizzazione di ricorsione

st= [] 
def combi(prefix, s): 
    if len(s)==0: return 
    else: 
     st.append(prefix+s[0])   

     ''' printing values so that I can see what happens at each stage ''' 
     print "s[0]=",s[0] 
     print "s[1:]=",s[1:] 
     print "prefix=",prefix 
     print "prefix+s[0]=",prefix+s[0] 
     print "st=",st 

     combi(prefix+s[0],s[1:]) 
     combi(prefix,s[1:]) 
     return st 

print combi("",'abc') 

Ho fatto stampare i valori in modo che io possa vedere cosa sta succedendo. Questa è l'uscita:

s[0]= a 
s[1:]= bc 
prefix= 
prefix+s[0]= a 
st= ['a'] 
s[0]= b 
s[1:]= c 
prefix= a 
prefix+s[0]= ab 
st= ['a', 'ab'] 
s[0]= c 
s[1:]= 
prefix= ab 
prefix+s[0]= abc 
st= ['a', 'ab', 'abc'] 
s[0]= c 
s[1:]= 
prefix= a ----> How did prefix become 'a' here. Shouldn't it be 'abc' ? 
prefix+s[0]= ac 
st= ['a', 'ab', 'abc', 'ac'] 
......... 
......... 
['a', 'ab', 'abc', 'ac', 'b', 'bc', 'c'] # final output 

uscita completa: http://pastebin.com/Lg3pLGtP

Come ho mostrato in uscita, come ha fatto diventare il prefisso 'ab'?

Ho provato a visualizzare le chiamate ricorsive per il combi (prefisso + s [0], s [1:]). Sto capendo bene? Visualization of Recursion

risposta

2

Ci sono due chiamate ricorsive a combi() nella funzione. Quindi il percorso delle chiamate non è una singola linea, ma piuttosto un albero binario che si biforca. Quello che stai vedendo è la seconda metà dell'albero.

+0

ho pensato che il 2 ° chiamata ricorsiva cioè 'combi (prefisso, s [1:])' iniziare come 'combi ('', 'bc')' e seguire lo stesso processo formando b, bc. Qui all'ultimo passo s [0] c'è 'c' e quando ricorre il prefisso + s [0] diventa '' + c = c se capisco bene? A proposito, ho aggiunto un link di tipo passbin del risultato completo alla domanda. – Bharat

+0

Se hai familiarità con la ricerca in profondità, è come viene menzionata l'albero che Amber sta attraversando (o generato, a seconda di come vuoi guardarlo). – kevintodisco

+0

@ RBK: È la chiamata per 'combi ('a', 'c')' * da * 'combi ('a', 'bc')' che sta creando il secondo 'prefisso = 'a''. – Amber

2

Ho disegnato l'albero di ricorsione. Per profondità First Traversal, l'output finale è ottenuto all'ultimo nodo. Questa visualizzazione aiuta a capire cosa sta succedendo.

Recursion Tree

6

Theres a python module per quella

rcviz output

Generato con:

from rcviz import callgraph, viz 
st= [] 
@viz 
def combi(prefix, s): 
    if len(s)==0: 
     return 
    else: 
     st.append(prefix+s[0])  
     combi.track(st = st) #track st in rcviz 
     combi(prefix+s[0],s[1:]) 
     combi(prefix,s[1:]) 
     return st 

print combi("",'abc') 
callgraph.render("combi.png") 
+0

Grazie. Sembra interessante. Ci proverò. – Bharat

+0

Questa libreria è molto utile. Grazie. Up votato. – Bharat

Problemi correlati