如何实现指定区间内从起始值交替上下计数的遍历逻辑
交替区间计数实现方案
需求梳理
实现逻辑需要满足以下规则:
- 从指定整数
start开始,在闭区间[min, max]范围内交替向上、向下计数 - 输出顺序按元素与
start的距离从小到大排列,同距离下优先输出大于start的值 - 禁止输出区间外的非法值,必须完整覆盖区间内所有整数,包含两个端点
示例入参:
var start = 4; var max = 10; var min = 0; var stepSize = 1;
对应期望输出:
4 5 3 6 2 7 1 8 0 9 10
原有实现问题
原有代码通过硬编码模运算、固定循环次数实现交替逻辑,没有加入边界判断:当某一侧计数触达区间端点后,仍按固定步长交替跳转,最终输出越界值-1,同时遗漏区间最大值10,仅能适配固定长度的区间场景,通用性差。
正确实现方案
核心逻辑是按距离逐轮遍历,每轮分别校验上下两个方向的值是否在合法区间内,合法才输出,直到两个方向都超出区间边界时终止循环。
通用while循环实现(适配任意参数)
// 入参定义 int start = 4; int max = 10; int min = 0; int stepSize = 1; // 先输出距离为0的起始值 Console.Write(start); int currentDistance = stepSize; // 只要任意方向还有合法值就继续遍历 while (start + currentDistance <= max || start - currentDistance >= min) { // 优先输出向上方向的合法值 int upValue = start + currentDistance; if (upValue <= max) { Console.Write($" {upValue}"); } // 再输出向下方向的合法值 int downValue = start - currentDistance; if (downValue >= min) { Console.Write($" {downValue}"); } // 距离累加步长,进入下一轮 currentDistance += stepSize; } Console.WriteLine();
运行上述代码可以直接得到期望输出,不存在越界、漏值问题,同时支持自定义步长、任意区间范围,不需要针对特定区间硬编码参数。
适配原有for循环框架的写法
如果需要沿用for循环结构,可将距离变量作为循环迭代值,边界判断作为循环终止条件:
// 先输出起始值 Console.Write(start); for ( int d = stepSize; start + d <= max || start - d >= min; d += stepSize ) { if (start + d <= max) Console.Write($" {start + d}"); if (start - d >= min) Console.Write($" {start - d}"); }
逻辑说明
- 不预设固定循环次数,所有值输出前都做区间合法性校验,从根源避免越界
- 单侧边先触达边界后,后续轮次会自动跳过该侧输出,仅处理另一侧剩余的合法值,直到双侧都触达边界自动终止
- 同距离下固定先输出向上方向的值,匹配要求的输出顺序
内容的提问来源于stack exchange,提问作者Sebastian Weiß
相关产品推荐
相关产品推荐

