1、前言
考虑这样一个问题,500个小孩围城一,从第一个小孩开始计数,逢三出圈(逢三:代表能被三整除,如6、27、468),使用python面向过程和面向对象进行编程解答。
2、面向过程 OPP
# 定义500个孩子
cycle = list(range(1, 501))
step = 1
while len(cycle) > 1:
dels = []
for kid in cycle:
if step % 3 == 0:
dels.append(kid)
step +=1
cycle = [i for i in cycle if i not in dels]
print(cycle)
3、面向对象 OOP
class Kid:
def __init__(self, gid):
self.gid = gid
self.left = None
self.right = None
class Cycle:
def __init__(self, n):
self.head = None
self.tail = None
for i in range(1, n + 1):
self.add(Kid(i))
def add(self, kid):
""" 向圈中添加一个小孩 """
if self.head is None and self.tail is None:
""" 如果圈中还没有小孩,则将第一个小孩作为头和尾 """
self.head = kid
self.tail = kid
kid.left = kid
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
cycle = Cycle(500)
cur = cycle.head
step = 1
while cycle.head is not cycle.tail:
cur = cur.left
if step % 3 == 0:
cycle.remove(cur.right)
step += 1
print(cycle.head.gid)