Это квадратный шаблон с каждой строкой, имеющей 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." "; } $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." "; } $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--." "; } 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." "; }
Вышеприведенный код должен выдавать следующий результат, так как вы завершаете цикл как $j
hits 1:
5 4 3 2 1 4 3 2 1 3 2 1 2 1 1
Я понимаю, почему вы получаете этот результат. Это потому, что вы не заботитесь о второй половине выхода. Итак, если вы хотите расширить свою логику, подумайте о выходе как о двух частях (для каждой строки):
$counter
Переменная $counter
которую вы установили, которая изменяется, но заканчивается на 1. Другой список чисел, которые всегда начинаются с 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." "; } //Takes care of the second half while($count > 0){ echo $k." "; $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; } }