tôi có một đối tượng obj
và một số chức năngĐang tính toán "đóng cửa" các thuộc tính của một đối tượng nhất định chức năng thay đổi các thuộc tính
def func1(obj):
#...
def func2(obj):
#...
def func3(obj):
#...
rằng mỗi thay đổi các giá trị của các thuộc tính của obj
.
Tôi muốn đầu vào của tôi là một cái gì đó giống như
obj = MyObject()
obj.attr=22
này phải được chuyển vào một chức năng closure()
rằng tính tất cả applictions có thể có của các chức năng trên, có nghĩa là func1(func2(obj))
, func3(func1(func1(obj)))
, vv lên đến một điều kiện dừng nhất định (ví dụ: không quá 20 tác phẩm chức năng).
Đầu ra phải là danh sách tất cả các kết quả đầu ra có thể cùng với tất cả các đường dẫn dẫn đến đó. Vì vậy, nếu nói 104
và 93
là kết quả cuối cùng có thể có nếu obj.attr=22
và có hai cách để đến số 104
và một để đến tại 93
. Sau đó
print closure(obj)
nên một cái gì đó giống như
[22, 64, 21, 104] #first path to 104 through , func1(obj),func1(func1(obj)), func1(func1(func3(obj)))
[22, 73, 104] #second path to 104 through , func3(obj),func3(func2(obj)),
[22, 11, 93] #the only path to arrive at 94
Làm thế nào tôi có thể thực hiện điều này? Như đã được đề xuất trong các ý kiến, điều này được thực hiện tốt nhất với cây, nhưng mặc dù tôi đã thử 2 ngày tôi hầu như không thực hiện bất kỳ tiến bộ nào thực hiện điều đó (tôi mới dùng Python/lập trình)!
Ví dụ của tôi đơn giản đến mức thay vì func(obj)
chúng tôi có thể trực tiếp sử dụng func(22)
nhưng ví dụ tôi cần làm là phức tạp hơn, nơi tôi chắc chắn sẽ cần sử dụng đối tượng, vì vậy đây sẽ là một ví dụ làm việc tối thiểu cho điều đó.
Cây có thể không phải là cây đầy đủ, vì mỗi ứng dụng chức năng sẽ chứa thử nghiệm cho dù nó có thể được áp dụng cho trạng thái hiện tại (thuộc tính) của obj
và trong một số trường hợp, thử nghiệm sẽ không thành công (các thuộc tính) obj
không đổi.
Có vẻ như bạn muốn có cấu trúc cây nơi mỗi nút là một trạng thái và phân nhánh xảy ra bởi các hàm (mỗi hàm nhận trạng thái và tạo một nút/trạng thái ** mới **). Đây là thực hành phổ biến trong AI và các lĩnh vực khác và có thể hữu ích ở đây. Để theo dõi những gì đã xảy ra, chỉ cần quay lại thư mục gốc khi bạn đã đạt đến trạng thái bắt buộc. Oh, và làm cho nó BFS nếu có thể :) –
@ReutSharabani Có, đó có vẻ như những gì tôi muốn tôi nghĩ, thx. Nhưng tại sao lại sử dụng BFS? – user47574
Vâng, nếu bạn sử dụng DFS và bạn có một đường dẫn ứng dụng vô hạn của các chức năng ... Bạn sẽ không bao giờ tìm thấy bất cứ điều gì có ý nghĩa ngay cả khi có một "giải pháp". Tuy nhiên, nếu có một giải pháp, DFS đảm bảo tìm nó (nhưng bạn trả tiền trong bộ nhớ, không giống DFS là bộ nhớ không đổi). Bạn cũng có thể sử dụng DFS lặp lại (google it) để đảm bảo nó dừng lại. –