Có cách nào để làm cho mã giống như mã sau hoạt động không?Python: có thể trộn máy phát và chức năng đệ quy không?
add = lambda n: (yield n) or add(n+1)
(câu trả lời không cần phải được trong phong cách chức năng)
Có cách nào để làm cho mã giống như mã sau hoạt động không?Python: có thể trộn máy phát và chức năng đệ quy không?
add = lambda n: (yield n) or add(n+1)
(câu trả lời không cần phải được trong phong cách chức năng)
def add(n):
yield n
for m in add(n+1):
yield m
Với máy phát điện recursive thật dễ dàng để xây dựng backtrackers công phu:
def resolve(db, goals, cut_parent=0):
try:
head, tail = goals[0], goals[1:]
except IndexError:
yield {}
return
try:
predicate = (
deepcopy(clause)
for clause in db[head.name]
if len(clause) == len(head)
)
except KeyError:
return
trail = []
for clause in predicate:
try:
unify(head, clause, trail)
for each in resolve(db, clause.body, cut_parent + 1):
for each in resolve(db, tail, cut_parent):
yield head.subst
except UnificationFailed:
continue
except Cut, cut:
if cut.parent == cut_parent:
raise
break
finally:
restore(trail)
else:
if is_cut(head):
raise Cut(cut_parent)
...
for substitutions in resolve(db, query):
print substitutions
Đây là một công cụ Prolog được thực hiện bởi một máy phát đệ quy. db là một dict đại diện cho một cơ sở dữ liệu Prolog về các sự kiện và các quy tắc. unify() là hàm thống nhất tạo ra tất cả các thay thế cho mục tiêu hiện tại và nối các thay đổi vào đường mòn, để chúng có thể được hoàn tác sau này. restore() thực hiện các kiểm tra undoing, và is_cut() nếu mục tiêu hiện tại là '!', để chúng ta có thể thực hiện việc cắt cành.
Ví dụ được thêm không có điều kiện chấm dứt. Bạn có ý định đó không? – Alice
Tôi không chắc chắn về mục đích của "năng suất (n) hoặc thêm (n + 1)", nhưng đệ quy máy phát điện là chắc chắn có thể. Bạn có thể muốn đọc liên kết dưới đây để nắm bắt những gì có thể, đặc biệt là phần có tiêu đề "Máy phát đệ quy".
Chức năng của bạn dường như với tôi chỉ để được biểu hiện khác cho chuỗi không ràng buộc:
n, n + 1, n + 2, ....
def add(x):
while True:
yield x
x+=1
for index in add(5):
if not index<100: break ## do equivalent of range(5,100)
print(index)
Đây không phải là đệ quy, nhưng tôi thấy không cần phải có kiểu đệ quy ở đây.
Phiên bản đệ quy dựa vào liên kết câu trả lời khác, trong đó có máy phát điện gọi máy phát điện, nhưng không đệ quy:
from __future__ import generators
def range_from(n):
yield n
for i in range_from(n+1):
yield i
for i in range_from(5):
if not i<100: break ## until 100 (not including)
print i
Bạn mong đợi điều gì để làm? –