У меня проблема с 2 кувшинами. начальное состояние [0,0], емкость каждого кувшина равна [4,9], состояние цели [0,6] правовые движения: заполнять кувшин 1 или кувшин 2 до конца, пустой кувшин 1 или кувшин 2 и бедный один кувшин в другой.Рекурсия Python, что мне не хватает
import search #get the interface
import sys
sys.setrecursionlimit(5000)
class two_jugs(search.Nodes):
#return the starting state vessel 1: 0, vessel 2: 0
def start(self):
return [0,0]
#returns true if node is equal to goal node
def goal(self,node):
return node ==(0,6)
#yields the successors of the configuration indicated by node
def succ(self,node):
# set capacities for vessel 1: 4, vessel 2 : 9
c = [4,9];
#stop at second last
for i in range(len(node)-1):
#create a safety copy
new_node = node[:]
#fill vessel 1
if new_node[i]<=0:
new_node[i]=c[i]
print new_node
#fill vessel 2
if new_node[i+1]<=0:
new_node[i+1]=c[i+1]
print new_node
#dump vessel i+1
if (new_node[i+1]>0):
new_node[i+1]=0
print new_node
#poor vessel i to vessel i+1
if (new_node[i+1]<c[i+1] and new_node[i]>0):
#calculate the difference
d = min(new_node[i],c[i+1]-new_node[i+1])
new_node[i]= new_node[i]-d
new_node[i+1]= new_node[i+1]+d
print new_node
#dump vessel i
if (new_node[i]>0):
new_node[i]=0
print new_node
#poor vessel i+1 to vessel 1
if (new_node[i]<c[i] and new_node[i+1]>0):
#calculate the difference
d = min(new_node[i+1],c[i]-new_node[i])
#set new node
new_node[i+1]= new_node[i+1]-d
new_node[i]= new_node[i]+d
yield new_node
print new_node
Вопрос в том, что я объявил все юридические шаги, почему моя программа возвращает только результат одного юридического хода? Например, из начального состояния [0,0], когда я запускаю программу, он возвращает [4,0], [0,4], [0,9] и другие возможные результаты до тех пор, пока рекурсия не прекратится, но не станет моей целью. Что мне не хватает?
breadth_first_search класс:
def breadth_first_search(problem, candidates):
if not candidates: return
# make sure there is something in the candidate list
# I am modifying ’candidates’ list here.
# Why don’t I need to copy?
c = candidates.pop(0) # pop from front
node = c[-1] # must exist
if problem.goal(node): return c
# base case
succ = [s for s in problem.succ(node)]
for s in problem.succ(node):
candidates.append(c + [s])
# 1-step extension
return breadth_first_search(problem, candidates)
поиск Класс:
class Nodes:
def succ(self,n):
raise Exception, "Successor undefined"
def start (self):
raise Exception, "Start undefined"
def goal (self,n):
raise Exception, "Goal undefined"
класс, который запускает программу:
import decant
from breadth_first_search import *
dec = decant.Decant()
print breadth_first_search(dec,[[dec.start()]])
Где находится рекурсия? – Barmar
Просьба предоставить гораздо больше информации о том, как все эти части должны соответствовать друг другу. – Stuart
Сначала я запускаю программу, запустив последний бит кода, который я разместил. Затем программа импортирует класс breadth_first_search, а затем печатает результаты этого класса. Основная проблема заключается в классе two_jugs. Все остальное верно. – spyr