100门问题实现优化求助:需将现有代码重构为三个函数
门开关问题代码优化方案
嘿,我来帮你把这段门开关的代码拆分成教授要求的三个函数,同时提升通用性!先回顾下原代码的逻辑:100扇门初始全关,第1轮切换所有门,第2轮切换每2扇门,直到第100轮,最后输出每扇门的状态。现在按照要求拆分实现:
函数实现思路与代码
1. create(num):初始化门的状态
这个函数的职责很明确——创建指定数量的门,并设置初始状态(全关闭,用False表示)。直接返回一个长度为num的列表即可:
def create(num): # 初始所有门关闭,用False表示 return [False] * num
2. switch(doors, nths):切换指定间隔的门状态
这里的nths是一个包含多个数字的可迭代对象(比如列表、range),每个数字n代表要切换每第n个间隔的门。注意门的编号是从1开始的,但列表索引是0开始,所以要从n-1的位置开始,以n为步长遍历切换状态:
def switch(doors, nths): for n in nths: # 从第n个门(索引n-1)开始,每n个门切换一次状态 for j in range(n-1, len(doors), n): doors[j] = not doors[j]
3. results(doors, val):提取指定状态的门编号
这个函数要返回所有状态等于val的门的编号(注意门编号是1-based,不是列表的0-based索引),用列表推导式就能简洁实现:
def results(doors, val): # 遍历索引和值,符合条件的返回门编号(索引+1) return [idx + 1 for idx, status in enumerate(doors) if status == val]
完整使用示例
把三个函数组合起来,模拟原代码的逻辑(100扇门,切换1到100所有间隔):
# 初始化100扇门 doors = create(100) # 生成需要切换的间隔列表:1到100 switch_intervals = range(1, 101) # 执行切换操作 switch(doors, switch_intervals) # 获取所有打开的门(状态为True) open_doors = results(doors, True) print("打开的门编号:", open_doors) # 获取所有关闭的门(状态为False) closed_doors = results(doors, False) print("关闭的门编号:", closed_doors)
优化后的优势
- 职责单一:每个函数只做一件事,代码更易读、易维护,出问题时也更容易定位;
- 通用性强:想改门的数量?直接调整
create的参数就行;想只切换特定间隔(比如只切换偶数间隔)?修改switch_intervals为range(2,101,2)即可;想提取不同状态的门?调用results时传入对应的值; - 便于验证:比如我们知道门开关问题的结论是只有完全平方数编号的门最后是打开的,运行代码后
open_doors会输出[1,4,9,...,100],很容易验证结果是否正确。
内容的提问来源于stack exchange,提问作者user12285659
相关产品推荐
相关产品推荐

