|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Peteryo01223 于 2021-5-24 14:03 编辑
最后的 print 里,即:第67行,
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 属性
|
|