Peteryo01223 发表于 2021-5-24 13:58:47

二问: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)

Twilight6 发表于 2021-5-24 14:03:26



这里主要是你 Circle 类中方法传入的参数对象都是Kid 类 的实例

而且你 Circle 类 的 变量 head 被赋值为 kid 为 Kid 类的实例对象了

则此时你 circle.head.gid 相当于 调用的是此时 head 被赋值为的 Kid 类实例对象的 gid 属性

页: [1]
查看完整版本: 二问:Py题 500个小孩