2012-02-07 25 views
7

tôi nhắc đến nhiều câu hỏi ở đây về đệ quy nhưng tôi không thể hiểu làm thế nào đệ quy làm việc cho vấn đề này cụ thể: chương trình đệ quy để có được tất cả sự kết hợp của các nhân vật trong một chuỗi bằng Python:Hiểu và hình dung đệ quy

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') 

Tôi đã in nó các giá trị để tôi có thể thấy những gì đang xảy ra. Đây là kết quả:

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 

Full đầu ra: http://pastebin.com/Lg3pLGtP

Như tôi đã trình bày trong đầu ra, làm thế nào tiền tố trở thành 'ab'?

Tôi đã cố gắng hình dung các cuộc gọi đệ quy cho combi (tiền tố + s [0], s [1:]). Tôi có hiểu nó đúng không? Visualization of Recursion

Trả lời

2

Có hai cuộc gọi đệ quy đến combi() trong hàm. Vì vậy, đường dẫn của các cuộc gọi không phải là một dòng duy nhất, mà là một cây nhị phân mà dĩa. Những gì bạn đang nhìn thấy là nửa thứ hai của cây.

+0

Tôi nghĩ cuộc gọi thứ 2 đệ quy tức là 'combi (tiền tố, s [1:]) ' sẽ bắt đầu như 'combi ('', 'bc')' và mặc dù quá trình tương tự tạo thành b, bc. Ở đây ở bước cuối cùng s [0] là 'c' và khi đệ quy tiền tố + s [0] trở thành '' + c = c nếu tôi hiểu đúng? Btw, tôi đã thêm một liên kết trong quá khứ của đầu ra hoàn chỉnh cho câu hỏi. – Bharat

+0

Nếu bạn đã quen thuộc với tìm kiếm theo chiều sâu, đó là cách cây Amber đề cập đang được duyệt qua (hoặc được tạo, tùy thuộc vào cách bạn muốn xem nó). – kevintodisco

+0

@RBK: Đó là cuộc gọi cho 'combi (' a ',' c ') '* từ *' combi (' a ',' bc ') 'đang tạo' tiền tố thứ hai =' a'' thứ hai. – Amber

2

Tôi đã vẽ cây đệ quy. Theo Depth First Traversal, kết quả cuối cùng là ở nút cuối cùng. Hiển thị trực quan này giúp hiểu điều gì đang xảy ra.

Recursion Tree

6

Theres a python module cho rằng

rcviz output

tạo với:

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

Cảm ơn. Trông có vẻ thú vị. Tôi se thử no. – Bharat

+0

Thư viện này rất hữu ích. Cảm ơn. Đã bỏ phiếu. – Bharat