Распечатайте шаблон для отображения чисел до 5 строк и 5 столбцов, таких как 5 4 3 2 1 и в следующей строке 4 3 2 1 5 до 5-й строки

Это квадратный шаблон с каждой строкой, имеющей 5 столбцов, и есть 5 строк, и шаблон выглядит так, как показано ниже:

5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 

Мой код выглядит так, как показано ниже, чтобы получить шаблон, но я не могу сбросить значение в каждом, когда счетчик достигнет 1 и отобразит его в соответствующем значении столбца.

Может ли кто-нибудь вести меня там, где мне не хватает логики?

 <?php $n=5; $count=5; for($i=5;$i>=1;$i--){ for($j=$count;$j>=1;$j--) { if($count>=1) echo $j."&nbsp;"; } $count--; echo "\n"; } ?> 

Я думаю, что это учебное упражнение, поэтому его нужно делать с помощью циклов.

 <?php $n=5; for($i=$n; $i>=1; $i--) { for($j=$n; $j>=1; $j--) { echo ($i + $j - 1) % $n + 1; echo ' '; // cosmetics :) } echo "\n"; } ?> 

% является модульным оператором. 6% 5 = остаток от деления 6 на 5 = 1.

Примеры: 1% 5 = 1; 5% 5 = 0; 12% 5 = 2.


Это простой выбор из модульной арифметики ( http://en.wikipedia.org/wiki/Modular_arithmetic ). Каждая новая строка – это не что иное, как простая операция добавления, но в наборе 5-mod number (для каждой строки, начиная с меньшего числа). И я думаю, что это лучшее и однострочное решение этой проблемы. Кроме того, операция проста и не требует много времени.

С наилучшими пожеланиями!

Вы можете попробовать следующее:

 $str = "5 4 3 2 1"; $arr_str = explode(' ', $str); $imax_loop = count( $arr_str); for($i = 0; $i < $imax_loop; $i++) { echo implode(" ",$arr_str) . "\n"; // Get the first element and pop it off $head_elm = array_shift($arr_str); // append the first element at the end of the array array_push( $arr_str, $head_elm); } 

Вывод

 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 

Если вы создаете массив с первой строкой, вы можете array_shift() первый элемент и array_push()

Если мы изменим ваш набор из:

  5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 

в

  4 3 2 1 0 3 2 1 0 4 2 1 0 4 3 1 0 4 3 2 0 4 3 2 1 

он выглядит намного больше (некоторый номер MOD 5) … поэтому ваш цикл может просто печатать (N% 5) +1

так что же такое N?

вместо того, чтобы смотреть на i и j как уменьшающиеся. возможно, мы можем смотреть на них как на увеличение и вычитание из какого-то числа.

Допустим, что я перехожу от 0-4, а j идет от 0-4. (не забудьте взглянуть на второй блок, так как после операции MODULUS мы будем делать +1.

предположим, что мы хотим добавить i и j вместе и отнять их от некоторого числа, изначально 4 может показаться хорошим, поскольку 4- (0 + 0) дает нам правую первую ячейку, но как только мы дойдем до конца второй строки, мы будем делать 4- (1 + 4), а отрицательные отрицательные числа вызывают проблемы с модулем. (Математика и языки программирования часто различаются по их интерпретациям.

9 mod 5 также 4, и мы никогда не будем вычитать больше 8 (когда i и j равны 4), поэтому 9 кажется лучшей ставкой.

 PSEUDOCODE for i from 0 to 4 for j from 0 to 4 print ( ( 9-(i+j) ) % 5 ) + 1 if j<4 print " " loop print newline loop 

Чтобы сделать цикл гибким для размеров, отличных от 5:

 PSEUDOCODE for i from 0 to SIZE-1 for j from 0 to SIZE-1 print ( ( ( (2*SIZE)-1) - (i+j) ) % SIZE ) + 1 if j<SIZE-1 print " " loop print newline loop 

На самом деле вопрос очень прост, и ОП имел большую часть правильности. Условия в его внутреннем цикле просто нужно было переработать и потребовалось условие if, чтобы добавить '5' к выходу, чтобы предотвратить переполнение, если числа скользнули в отрицательный диапазон

 <?php $n=5; $count=0; for($i=5; $i>=1; $i--){ // You still want to loop through here 5 times, because you need to print out 5 numbers for($j=5; $j>=1; $j--) { // The fun part is augmenting your output so the numbers don't ever slip below 0 or negative. // This is already partially achieved in the fact that the range of your values is 5. // So if the value slips below the desired threshold, incrementing it by your range will bring it back into desired range $out = $j - $count; if ($out <= 0) { $out += 5; } echo $out."&nbsp;"; } $count++; echo "\n"; } ?> 

$ str = '54321';

echo $ str. "\ n";

для ($ = 1; $ г <= 4; $ я ++) {

 $a=$str[0]; $var = substr($str,1); echo $str=$var.$a; echo "\n"; 

}

и если вы не хотите использовать функцию substr, попробуйте это

  $str = '54321'; $len = strlen($str); $s= ''; for ($i=0;$i<$len;$i++){ print_r($str); print_r($s); $s = $s.$str[$i]; $str[$i] = ''; echo '<br>'; } 

Немного изменил ваш код:

 <?php $limit=5; $count=5; for($i=5;$i>=1;$i--){ for($j=$limit;$j>=1;$j--) { $count = ($count>=1)?$count:5; echo $count--."&nbsp;"; } if($count<1) $count=$i-1; else $count--; echo "<br>"; } ?> 

DEMO

Вывод:

 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 

Я попытаюсь объяснить, где вы можете улучшить свою логику для указанного кода. Вы хотите 5 строк и 5 столбцов значений, т.е. 25 значений в этом шаблоне. Ваш самый внешний for цикла работает 5 раз и составляет 5 строк, которые работают.

Однако внутренняя петля, т. Е.

 $count = 5; //initially and gets reduced by 1 on every iteration for($j=$count;$j>=1;$j--) { if($count>=1) echo $j."&nbsp;"; } 

Вышеприведенный код должен выдавать следующий результат, так как вы завершаете цикл как $j hits 1:

  5 4 3 2 1 4 3 2 1 3 2 1 2 1 1 

Я понимаю, почему вы получаете этот результат. Это потому, что вы не заботитесь о второй половине выхода. Итак, если вы хотите расширить свою логику, подумайте о выходе как о двух частях (для каждой строки):

  1. Список чисел, начинающийся с 5, т. $counter Переменная $counter которую вы установили, которая изменяется, но заканчивается на 1.
  2. Другой список чисел, которые всегда начинаются с 5, которые учитывали бы вторую половину и таким образом производят ожидаемый результат:

      //1st half //2nd half 5 4 3 2 1 4 3 2 1 5 3 2 1 5 4 2 1 5 4 3 1 5 4 3 2 

Поэтому просто добавление другого цикла for / while после того, как ваш существующий цикл должен позаботиться об этом. Возможно, вы захотите попробовать что-то вроде этого:

  $n=5; for($i=5;$i>=1;$i--){ $count=5 - $i; $k = 5; //Takes care of the firs half for($j=$i;$j>=1;$j--) //because $i gets decreased every time any way { if($i>=1) echo $j."&nbsp;"; } //Takes care of the second half while($count > 0){ echo $k."&nbsp;"; $k--; } echo "\n"; } 

Шаг первый: Плачьте о том, что PHP не имеет встроенного array_rotate, который может работать на скорости языка C.

Шаг второй: используйте версию array_rotate из комментариев на PHP-сайте, который будет работать в крайнем случае. (Эта версия, вероятно, ужасна из-за array_shift, если используется на больших массивах, но в нашем случае это meh)

 function array_rotate(&$arr) { $elm = array_shift($arr); array_push($arr, $elm); return $elm; // return the moved element value } 

Шаг третий:

 $a = [ 5, 4, 3, 2, 1 ]; for ($i=0; $i<5; $i++) { echo join(' ',$a) . PHP_EOL; array_rotate($a); } 

Шаг четвертый: ???

Шаг пятый: прибыль!

Попробуй это

 $n=5; $arr = array(); for($j=$n;$j >0;$j--) { for($k = $n;$k>0;$k--) { echo $k. " "; } echo implode(" ",$arr); array_push($arr,$n); echo '<br/>'; $n--; } , $n=5; $arr = array(); for($j=$n;$j >0;$j--) { for($k = $n;$k>0;$k--) { echo $k. " "; } echo implode(" ",$arr); array_push($arr,$n); echo '<br/>'; $n--; } 
 for ($i=0;$i<=33;$i++){ echo"<br>".$i; for ($j = 0; $j < $i; $j++) { echo $j; } }