鱼C论坛

 找回密码
 立即注册
查看: 2296|回复: 1

[已解决]二问:Py题 500个小孩

[复制链接]
发表于 2021-5-24 13:58:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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)
最佳答案
2021-5-24 14:03:26


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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-24 14:03:26 | 显示全部楼层    本楼为最佳答案   


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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-9 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表