2010-07-18 27 views

Trả lời

3
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.

+0

Ví dụ được thêm không có điều kiện chấm dứt. Bạn có ý định đó không? – Alice

3

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".

0

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 
Các vấn đề liên quan