使用Python将数值范围逐步缩小至单个数值
实现逐步缩小数值范围至单个值的可复用方案
核心逻辑
- 将当前数值范围划分为1-10个均等子范围(支持float类型)
- 通过输入组号锁定目标子范围,重复该过程直到范围精度满足要求
- 所有逻辑封装为可复用函数,支持自定义分组数量、精度阈值
代码实现
def split_range(min_val, max_val, num_groups): """将指定范围划分为指定数量的子范围,返回子范围列表""" if not (1 <= num_groups <= 10): raise ValueError("分组数量必须在1-10之间") interval = (max_val - min_val) / num_groups sub_ranges = [] for i in range(num_groups): start = min_val + i * interval # 最后一组直接取到max_val,避免浮点精度误差 end = start + interval if i != num_groups - 1 else max_val sub_ranges.append((start, end)) return sub_ranges def narrow_down_range(start_min, start_max, num_groups=2, tolerance=1e-6): """交互式逐步缩小范围,直到得到单个数值""" current_min, current_max = start_min, start_max while abs(current_max - current_min) > tolerance: print(f"\n当前范围: [{current_min:.4f}, {current_max:.4f}]") try: # 生成子范围 groups = split_range(current_min, current_max, num_groups) # 打印分组信息 for idx, (s, e) in enumerate(groups, 1): print(f"组 {idx}: [{s:.4f}, {e:.4f}]") # 获取用户输入 choice = int(input(f"请输入目标所在的组号(1-{num_groups}): ")) if not (1 <= choice <= num_groups): print(f"无效输入,请输入1-{num_groups}之间的数字") continue # 更新当前范围 current_min, current_max = groups[choice - 1] except ValueError as e: print(f"错误: {e}") continue # 取范围中点作为最终值 final_value = (current_min + current_max) / 2 print(f"\n最终确定数值: {final_value:.6f}") return final_value
使用示例
示例1:2组分组,从1到110开始缩小
# 调用函数,默认2组分组,精度阈值1e-6 narrow_down_range(1, 110)
示例2:自定义分组数量与精度
# 用5组分组,从0.2到100000开始,精度阈值设为0.01 narrow_down_range(0.2, 100000, num_groups=5, tolerance=0.01)
扩展说明
- 分组数量调整:调用
narrow_down_range时修改num_groups参数,取值范围1-10 - 精度控制:修改
tolerance参数,当当前范围的差值小于该值时停止循环 - 浮点支持:直接传入float类型的起始范围即可,函数会自动处理浮点运算
- 避免一次性计算:每次仅根据当前范围生成子分组,无需提前计算所有可能路径
内容的提问来源于stack exchange,提问作者steven-14
相关产品推荐
相关产品推荐

