2011-08-20 10 views
5

Tôi muốn tạo tất cả các đường dẫn từ mọi lá đến gốc trong cây. Tôi muốn làm điều đó với máy phát điện, để tiết kiệm bộ nhớ (cây có thể lớn). Đây là mã của tôi:Python (năng suất): tất cả các đường dẫn từ lá này sang gốc khác trên cây

def paths(self, acc=[]): 
    if self.is_leaf(): 
     yield [self.node]+acc 

    for child in self.children: 
     child.paths([self.node]+acc) 

Nhưng nó không hoạt động. Tại sao? Viện dẫn ở gốc, nó đi qua cây từ trên xuống dưới, thu thập các nút trong "acc". "acc" phải được trả về trong mỗi lá ...

is_leaf() là đúng nếu self.children trống.

Trả lời

7

Mã này chỉ mang lại lá (ngay) con của gốc. Những cái khác được truy cập, chúng sinh ra hàm trên, nhưng hàm trên không làm gì với chúng. Những gì bạn cần là mang lại cho họ từ chức năng thấp hơn đến chức năng phía trên:

def paths(self, acc=[]): 
    if self.is_leaf(): 
     yield [self.node]+acc 

    for child in self.children: 
     for leaf_path in child.paths([self.node]+acc): # these two 
      yield leaf_path       # lines do that 

Điều này nên thực hiện thủ thuật.

+0

Tôi luôn tự hỏi - có lệnh "thu hút tất cả" nhanh hay ngắn nhất là vòng lặp 'for' bạn đã viết? – Owen

+0

@Own nope, nhưng tôi thấy nó OK như thế này, nó chỉ là hai dòng đơn giản ... –

+5

Trong Python 3.3 sẽ có câu lệnh 'yield from' sẽ tự động tạo ra các mục từ một trình tạo khác, vì vậy bất kỳ vòng lặp' for' nào với một 'yield' trong đó bạn có thể viết dưới dạng một biểu thức máy phát có thể được tạo thành một dòng. – agf

1

Hiện tại, vòng lặp for không yield bất kỳ thứ gì. Thay vào đó, nó sẽ mang lại tất cả các yếu tố được tạo bởi cuộc gọi đệ quy:

for child in self.children: 
    for path in child.paths([self.node]+acc): 
     yield path