二问:Py题 500个小孩
本帖最后由 Peteryo01223 于 2021-5-24 14:03 编辑最后的 print 里,即:第67行,
print(circle.head.gid)
circle.head.gid,能帮我解释一下,gid 是怎们进来的么?
我想问:如果,circle.head 是 Circle 类的实例化属性。那么 Kid 类 的属性 gid,怎们能拿过去直接实例化 Circle 类的属性呢?这三个东西用两个英文句号链接在一起,我就没看懂。难道是,用 Circle类的一个实例化属性,放到了 Kid类里面,去进行实例化么?
正确的code如下:
# 第一个类:kid
# 第二个类:circle
# kid 属性:编号gid,lefthand、righthand
# 圈属性:head 和 tail。
# 圈的行为:加入一个小孩,移除一个小孩。
class Kid:
def __init__(self, gid):
self.gid = gid# 小孩属性之编号
self.left = None# 小孩属性之左手
self.right = None# 小孩属性之右手
class Circle:
# 初始化的时候,定义圈的头和尾
def __init__(self, count):
self.head = None
self.tail = None
for i in range(count):
self.add(Kid(i + 1))
def add(self, kid):
# 向圈里,加入一个小孩
# 如果圈里,一个孩子都没有
if self.head is None and self.tail is None:
# 如果头尾相同的情况,也就是说这个小孩就是答案
self.head = self.tail = kid.left = kid.right = kid
else:
# 向圈里,加小孩
kid.left = self.head# 加入的小孩左手边是打头的小孩
kid.right = self.tail# 加入的小孩的右手边,是末尾的小孩
self.head.right = kid# 打头的小孩右手边,是加入的新小孩
self.tail.left = kid # 末尾的小孩右手边,是加入的新小孩
self.tail = kid# 定义,加入的新小孩,成为了圈的尾。
def remove(self, kid):
# 从圈里面移除一个小孩
if kid is self.head:
self.head = kid.left
if kid is self.tail:
self.tail = kid.right
kid.left.right = kid.right
kid.right.left = kid.left
kid.left = None
kid.right = None
circle = Circle(500)
cur = circle.head
step = 1
while circle.head is not circle.tail:
# 当圈里不只一个小孩的时候,就继续。直到,圈里仅剩下,一个孩子为止。
cur = cur.left
# 让当先的教鞭,指向头上的小孩开始。指向下一个,左边的小孩,判断这个小孩要不要出圈。
if step % 3 == 0:
circle.remove(cur.right)
# 符合这个条件,则这个小孩出圈。
# 如果直接移除 cur,那就找不到 cur 本身的位置了。
# 所以,采用了指针指向左侧的下一个位置,然后移除这个位置右边的小孩。
step += 1
# 定义一个计步器step
print(circle.head.gid)
这里主要是你 Circle 类中方法传入的参数对象都是Kid 类 的实例
而且你 Circle 类 的 变量 head 被赋值为 kid 为 Kid 类的实例对象了
则此时你 circle.head.gid 相当于 调用的是此时 head 被赋值为的 Kid 类实例对象的 gid 属性
页:
[1]