首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环,它从范围内的开始索引中进行上下计数。

循环,它从范围内的开始索引中进行上下计数。
EN

Stack Overflow用户
提问于 2022-06-23 18:35:42
回答 4查看 194关注 0票数 2

我很难开发一个从给定整数开始的for循环(start),然后在给定的范围内(从最小到最大)从这个起点开始计算。我想要的结果是有序的距离到给定的开始。如果一个for -循环不是这里的正确工具,我是开放的其他建议!

由于这一点很难解释,下面有一个例子:

代码语言:javascript
复制
var start = 4;
var max = 10;
var min = 0;
var stepSize = 1;
for(var i=startIndex; i>=min && i<=max; ???) {
  Console.WriteLine(i)
}

结果应该如下所示:

代码语言:javascript
复制
4 5 3 6 2 7 1 8 0 9 10

对我来说,真正棘手的部分是,为了达到最大值10,同时不低于0,必须停止交替。

我开始实验,并有了一个解决方案,可以适用于第一步:

代码语言:javascript
复制
const int start = 4;
const int stepSize = 1;
    
for (var (i,j,k) = (start,1,5); Math.Abs(j)<=11; k=(k+j),j=-j-Math.Sign(j)*stepSize,i=(k+(start-5))%11) {
  Console.WriteLine(i);
}

对于需要交互的第一部分来说,这很好,但是一旦需要停止替换,它就会中断。这个实验的结果是:

代码语言:javascript
复制
4 5 3 6 2 7 1 8 0 9 -1
EN

回答 4

Stack Overflow用户

发布于 2022-06-23 20:14:09

这里有一个for循环,但就像其他人已经提到的那样,我认为其他结构更适合您的任务:

代码语言:javascript
复制
  public static void Main() {
    int start = 4;
    int max = 10;
    int min = 0;
    int stepSize = 1;
    for(int i=start, j=start; i>=min || j<=max; i-=stepSize, j+=stepSize) {
      if (i==start) {
        Console.Write(i + " ");
      }
      else {
        if (j <= max) {
          Console.Write(j + " ");
        }
        if (i >= min) {
          Console.Write(i + " ");    
        }        
      }      
    }
  }
票数 2
EN

Stack Overflow用户

发布于 2022-06-23 20:33:59

你想要的顺序:

代码语言:javascript
复制
4 5 3 6 2 7 1 8 0 9 10

可指定如下:

代码语言:javascript
复制
4 - 3 - 2 - 1 - 0
- 5 - 6 - 7 - 8 - 9 10 
- - - - - - - - - - --
4 5 3 6 2 7 1 8 0 9 10

使用类似于MoreLinq的东西,可以这样表示:

代码语言:javascript
复制
Sequence(4, 0).Interleave(Sequence(5, 10))

显然,您通过控制两个序列的值来控制startmaxmin。因此,假设您想从7开始,向上和向下,作为最小值,14作为最大值。这个电话就像:

代码语言:javascript
复制
Sequence(7, 1).Interleave(Sequence(8, 14))

最后,这还允许您通过交换间隔,轻松地从“向上-向下”更改为“向下”。使用上面的例子:

代码语言:javascript
复制
Sequence(8, 14).Interleave(Sequence(7, 1))

请注意,Sequence还有一个重载,它接受一个step参数,因此您还可以使用任意的步骤增量(而不仅仅是1 )来扩展下面的示例。

票数 2
EN

Stack Overflow用户

发布于 2022-06-23 20:49:02

由于您明确声明要生成模式的for循环,那么这种方法如何:

首先找到更大的“距离”,然后让循环运行到这个点,而不是从0开始。在循环中,检查两个方向,并内联地进行计算,并使用原始值一次调用该方法。

代码语言:javascript
复制
int x = 4;
int min = 0;
int max = 10;

int largest = Math.Max(Math.Abs(min - x), Math.Abs(max - x));

YourMethod(x);
for (int i = 1; i <= largest; i++)
{
    if (x + i <= max)
        YourMethod(x + i);
    if (x - i >= min)
        YourMethod(x - i);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72735081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档