今天我在课堂上做了一个小测验,结果很惨,测验如下。 有人能帮我解释一下吗。在
open()
,该方法将断开链接与“仅在其左侧”的链接,从而打开项链,同时保持右侧链的完整性。例如,如果抓取link1
处的项链,那么调用link1.open()
会断开link3
与{link1
到{这是我目前拥有的:
class Diamond(object):
def __str__(self):
return "Diamond"
class Ruby(object):
def __str__(self):
return "Ruby"
class Visitor:
def __str__(self):
return self.__class__.__name__
class Link(object):
def __init__(self, index, jewel = None):
self.jewel = jewel
self.index = index
def connectTo(self, link):
self.nextLink = link
def __next__(self):
return self.nextLink or None
def attach(self, jewel):
if not self.jewel:
self.jewel = jewel
def detatch(self):
stone = self.jewel
self.jewel = None
return stone
def open(self):
pass
def __str__(self):
return "link%d" % (self.index)
class Necklace(object):
def __init__(self, base):
self.base = base
def describe(self):
link = self.base
while True:
print link, "with", link.jewel, "attatched to", link.nextLink, "with", link.nextLink.jewel
link = link.nextLink
if link == self.base:
break
def getJewel(self):
link = self.base
while True:
link = link
if isinstance(link.jewel, Diamond):
print "a", link.detatch()
break
link = link.nextLink
if link == self.base:
print "nothing..."
break
def acceptVisitor(self, visitor):
visitor.visit(self)
class DiamondThief(object, Visitor):
def __init__(self, base):
self.base = base
self.jewel = self.base.jewel
def visit(self, necklace):
necklace.getJewel()
def searchForDiamond(self):
self.visit(myNecklace)
link1 = Link(1, Ruby())
link2 = Link(2, Diamond())
link3 = Link(3, Ruby())
link1.connectTo(link2)
link2.connectTo(link3)
link3.connectTo(link1)
myNecklace = Necklace(link1)
myNecklace.describe()
print "Uh on here comes a thief..."
thief = DiamondThief(link1)
print "Oh no he took "
thief.searchForDiamond()
myNecklace.describe()
让我们看看每个类需要什么函数?
Link
name
(可能)linked_to
或^{cd4>}jewel
connectTo(self,link)
attach(self,jewel)
open(self)
get_next(self)
Necklace
(不在下面的代码中,请自行制作)__next__(self)
或^{cd14>}DiamondThief
link
diamond
getDiamond(self)
Jewels
类似^{cd21>}或^{cd22>}看到这个代码,我还添加了Diamond盗贼类。。。
第1部分简单地要求您使用
Link
类中描述的方法来构建一个指定的项链:第2部分需要一个Link和diamond小偷类的实现。在
下面是我如何实现
^{pr2}$Link
,作为一个双链接列表。您实际上并不需要第二个链接来实现我们在本部分中需要做的基本方法,但是如果我们同时引用了左边和右边的相邻链接,那么在第3部分中添加open
将更加容易。在这是我的
^{3}$DiamondThief
访问者的实现。它的主要方法是visit
,它递归地访问后续的Link
实例,直到找到钻石或者它循环(或者从打开的项链的末端跑出来)。您可以用while
循环而不是递归来做同样的事情,但这似乎更简单。注意,递归调用中的or
表达式意味着如果first
为None(默认情况下为None),那么link
将作为first
传递。在第3部分要求您向
open
类添加一个open
方法。由于Link
是双重链接的,所以很容易将列表拆分到当前位置的左侧。如果你把它实现为一个单链链表,你必须扫描整个项链(从每个链环到它的右邻居),直到找到链接到第一个实例的那条。如果项链没有形成一个环,那就完全不起作用了。在总之,下面是一个简单的实现:
相关问题 更多 >
编程相关推荐