在for循环中交替执行操作

20

我是Java的初学者,请多多包涵 :) 我还没有学习过像if语句这样的知识,我只学了循环、变量和类。我需要编写一条单独的循环来产生以下输出:

10 0 9 1 8 2 7 3 6 4 5 5

从这一段可以看出,数字之间的差值每次减少1,所以从10到0会减去10,然后从0到9会增加9,接着不断交替进行加和减。

我的想法是在循环中创建一个变量i=10,并在循环中将其递减(i--),但我不太确定如何在循环中交替进行加和减?

 public class Exercise7 {
    public static void main(String[] args) {            
        for(int i = 10; i >= 0; i--) {
            System.out.print(i + " ");
        }
    }
 }

想一想:你想要对哪些 i 值进行加法,哪些进行减法? - user1803551
8
我喜欢老式可靠的 System.out.println("10 0 9 1 8 2 7 3 6 4 5 5");,但我想指示书上说要用循环。 嗯,也许只需要循环一次... - markspace
12个回答

22
为什么不加两个额外的变量,一个递增而另一个递减:
int y = 0;
int z = 10;
for(int i = 10; i >= 5; i--) {
      System.out.print(z + " " + y + " ");
      y++;
      z--;
}

输出:

10 0 9 1 8 2 7 3 6 4 5 5 

不过,我们也可以在不使用额外变量的情况下完成这个操作:

for(int i = 10; i >= 5; i--) {
   System.out.print(i + " " + 10-i + " ");        
}

2
y++和z--真的很聪明,我没有想到过!谢谢你的帮助! - WoeIs

20
我认为提问者并不希望有人替他做作业,所以我会坚持回答他实际提出的问题:如何在循环中交替执行两个操作(以便保留他们想出的算法 :))。
大多数编程语言中通常使用一种巧妙的“技巧”,当我们想要每隔一个迭代执行一次某些操作时,您一定会在生活中遇到它,如果您不知道发生了什么,这可能会令人困惑。下面是解释:
取模(%)运算符将产生其操作数之间的除法余数。
例如,考虑以下内容:7 ÷ 2 = 3.5 当处理整数时,您可以说 7 ÷ 2 = 3 ,然后剩下 1
在这种情况下,当所有变量都是int时,在Java中7/23 7 % 2 1
这就是%运算符!
这个运算符的有趣之处在于它与除法本身有关,并且有一个特殊的情况:通过 2 除的余数始终为 0 1 ...并且它们是交替的!这就是关键词。
以下是每个迭代中交替执行操作的“技巧”(实际上不是技巧,而是一种模式,考虑到它被广泛使用):
1.获取在循环中每次增加的任何变量 2.测试该变量与 2 的除法余数 3.如果它是 0 ,则执行某些操作,否则(它将是 1 ),请采取备用路径!
对于您的情况,要回答您实际提出的问题(尽管其他人也有好意见,但我不打算从任何人那里夺走),您可以考虑使用类似于以下内容的内容:
if( i % 2 == 0 ) {
    // i is even, subtract
} else {
    // i is odd, add
}

这将允许您继续使用最初想到的算法!


2
另一种交替操作的方法是在1和-1之间切换。 循环之前i = 1,循环内部i = i * -1 或者如果你想在1和0之间交替,可以在循环中使用i = (i - 1) * -1 这不能用于for循环的索引变量。 - Ilia Gilmijarow
@IliaGilmijarow 我在这里描述的解决方案的优点是,它可以轻松地在不仅两个选项之间,而且三个、四个或任何其他数量之间进行切换。它足够通用,可以实现任何FizzBuzz类型的例程! - ccjmne
是的,@ccjmne。这是真的。我只是想提供另一种方式。也许有人会觉得有帮助... - Ilia Gilmijarow
@IliaGilmijarow:哦,当然可以!你完全可以这样做。我并不是要让你闭嘴或者什么的,很抱歉我的评论听起来有点粗鲁。 - ccjmne

6
public class exercise7 {
    public static void main(String[] args) {

        for(int i = 10; i >= 5; i--) {
            System.out.print(i + " " + (10-i) + " ");
        }
    }
}

5

如果你想要耍聪明,你也可以这样做;)

for(int i = 0, arr[] = {10,0,9,1,8,2,7,3,6,4,5,5}; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

为什么不用 int[] arr = {...}; for (int a : arr) /* */ ; 呢? :P - hyper-neutrino
2
通常最好在变量上保持尽可能紧密的作用域。由于“arr”在循环外部未被使用,因此其作用域仅限于循环本身。 - markspace

5

i >= 0 替换为 i >= 5

新增代码: System.out.print((10-i--) + " ");

从您所做的开始

public class Exercise7 {
      public static void main(String[] args) {        
          for(int i = 10; i >= 5; ) {
              System.out.print(i + " " + (10-i--) + " ");                 
          }
      }
 }

5

有些事情不需要过分思考:

public class Answer2 {


    public static void main(String[] args) {

        for (int i = 0; i <= 5; i++){
            System.out.println(i);
            System.out.println(10 - i);
        }
    }
}

编辑

你可以和应该把你的任务泛化。以下是一个例子,展示了你如何做到这一点(我不会写出具体方法,因为这是你的工作 - 取而代之的是,我将修改我的答案,以展示你的可能性)。

public class Answer2 {

    private static final Random RANDOM = new Random();

    public static void main(String[] args) {

        //You can use any upper bound for 'someLength'
        int someLength = 1 + RANDOM.nextInt(20);

        for (int i = 0; i <= someLength / 2; i++) {
            System.out.println(someLength - i);
            System.out.println(i);
        }
    }
}

5

这似乎有点像一项作业任务,所以我不会给你工作代码。

但请记住,您可以在for循环内放置多个print语句。您不一定需要迭代10次以获得输出。5次完全足够了。如上面的评论已经说明的那样:对于正确的i范围,数字在i和10-i之间交替。


4

谁说你在循环中只能使用一个 System.out.print

for (int i=0; i < 5; i++) {
    System.out.print((10 - i) + " " + (i + 1) + " ");
}

1
回答不错,但有趣的是你在循环中仍然只使用了一个 System.out.print :P - hyper-neutrino
1
是的。一开始考虑使用两个,但后来决定,嘿,我已经在做字符串拼接了。 - Johannes Kuhn
1
这将打印出 10 1 9 2 8 3 7 4 6 5。你可能在循环中想要使用 i <= 5,并且在 print() 中使用 i 而不是 i+1 - walen

4

您应该考虑将系列泛化。正如您所观察到的,该系列在加和减之间交替出现。此外,差异每步减少一。您可以为这两个变量定义变量并在循环中进行调整。

    public static void main(String[] args) {
        int term = 10;
        int sign = 1;
        for(int delta = 10; delta >= -1; delta--) {
            System.out.print(term + " ");
            sign = -1 * sign;
            term = term + sign * delta;
        }
    }

1
只需简单地运行一个循环,可以从0或10开始。
1. 如果从10开始。
for(int i=10;i>=5;i--){
   System.out.print(i + " " + (10-i) + " ");
}

如果你从0开始
for(int i=0;i<=5;i++){
   System.out.print((10-i) + " " + i + " ");
}

输出结果为: 10 0 9 1 8 2 7 3 6 4 5 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接