Петля спереди и сзади в одну строчку


11

Я думаю, что это интересный вопрос. Мы можем выполнить цикл одним способом, но можем ли мы выполнить цикл в обратном направлении в той же строке? Позвольте мне объяснить, что я имею в виду. Вот пример кода:

for(int i = 0; i < 5; i++) { // we all know the output will be 0,1,2,3,4

Я смотрю, есть ли обходной путь, чтобы вышеприведенное утверждение можно было распечатать 0,1,2,3,4,3,2,1,0?

java 

Ответы:




2

Вся логика в одной строке, как ОП спросил

  for(int i=0, d=1; i>=0 ;d=(i==4?-1:d), i+=d){
    System.out.print(i +" ");
  }

1
Этот ответ удивителен и более универсален, чем остальные (+1) - вы можете заменить 0 и 4 в условиях цикла для аргументов функции, таких как min и max, а затем очень универсально! Alex
Алекс Л

1

С небольшой арифметикой вы можете:

for (int i = 0; i < 9; i++) {
    System.out.println(4 - Math.abs(4 - i));
}

Но просто использовать два forцикла легче писать и читать.




1

Нет действительно простого способа сделать это, но с несколькими модификациями вы можете получить цикл, который может изменить направление:

for(int i = 0, direction = 1; 0 <= i && i < 5; direction = (i == 5-1) ? -direction : direction, i += direction)
    System.out.println(i);

0

В Java (универсальный, не должен быть между 0 и N):

public static void forwardAndBack(int min, int max) {
  for (int i = 0; i < (max - min + 0.5) * 2; i++) {
    System.out.println((min + i) > max ? max - (min + i - max) : min + i);
  }
}
forwardAndBack(1, 4);

В JavaScipt (просто чтобы вы могли увидеть живую демонстрацию):

function forwardAndBack(min, max) {
  for (let i = 0; i < (max - min + 0.5) * 2; i++) {
    console.log(min + i > max ? max - (min + i - max) : min + i);
  }
}
forwardAndBack(1, 4);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0

Универсальный вкладыш, вся логика в forвыражениях.

int start = 0;
int max = 4;
  for(int n= start, asc = start, desc = max * 2 - start;  
       (n = asc < desc ? asc: desc) >= start ; 
       asc++, desc--)
       {
          System.out.print(n+ " ");
       }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.