我试图使用嵌套循环从数字中制作反射模式。
我已经尝试了,但输出看起来像这样:
|0|1|2|
|0|1|2|
|0|1|2|
这是我的代码:
<?php
echo "<table border =\"1\" style='border-collapse: collapse'>";
for ($row=1; $row <= 3; $row++) {
echo "<tr> \n";
for ($col=1; $col <= 3; $col++) {
$p = $col-1;
echo "<td>$p</td> \n";
}
echo "</tr>";
}
echo "</table>";
?>
我期待这个结果:
|0|1|0|
|1|2|1|
|0|1|0|
每个列'和行'单元格值必须递增到给定量,然后递减以形成镜像/回文序列。
首先声明表格单元格数的平方根。换句话说,如果你想要一个5乘5的细胞桌(25个细胞),宣布$size = 5
由于您的数字从零开始,显示的最高整数应该是$size - 1
- 我将其称为$max
。
我支持你的嵌套循环设计,变量适当地命名为$row
和$col
。
在这些循环中,您只需要将“计数器”区分为高于或低于$max
值的一半。如果它高于$max / 2
,则从$row
中减去“计数器”(例如$col
或$max
)。
通过将两个可能调整的“计数器”相加并在内循环中打印它们,您可以生成所需的模式(或者至少是我想要的模式)。这个解决方案适用于来自$size
及更高版本的0
值 - 玩我的演示链接。
代码:(Demo)
$size = 5;
$max = $size - 1;
echo "<table>\n";
for ($row = 0; $row < $size; ++$row) {
echo "\t<tr>";
for ($col = 0; $col < $size; ++$col) {
echo "<td>" . (($row >= $max / 2 ? $max - $row : $row) + ($col >= $max / 2 ? $max - $col : $col)) . "</td>";
}
echo "</tr>\n";
}
echo "</table>";
输出:
<table>
<tr><td>0</td><td>1</td><td>2</td><td>1</td><td>0</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>2</td><td>1</td></tr>
<tr><td>2</td><td>3</td><td>4</td><td>3</td><td>2</td></tr>
<tr><td>1</td><td>2</td><td>3</td><td>2</td><td>1</td></tr>
<tr><td>0</td><td>1</td><td>2</td><td>1</td><td>0</td></tr>
</table>
有很多方法可以实现这一目标。
一个简单的方法是;
<?php
$baseNumber = 0;
echo "<table border='1' style='border-collapse: collapse'>";
for ($row = 0; $row < 3; $row++) {
echo "<tr>";
if ($row % 2 !== 0) {
$baseNumber++;
} else {
$baseNumber = 0;
}
for ($col = 0; $col < 3; $col++) {
echo "<td>" . ($col % 2 === 0 ? $baseNumber : $baseNumber + 1) . "</td>";
}
echo "</tr>";
}
echo "</table>";
这个代码将做你想要的只是call
patternGenerator
函数与你想要的例子数量为3(0,1,2)。
这段代码中的想法是使用两个for loops
,一个从最小数字开始到最大数字,另一个在最大数字减少到最小值之后开始。
例如:如果min = 0
和max = 5
第一个loop
将打印0,1,2,3,4,5而第二个将打印4,3,2,1,0就是这样。
起初,我创建了一个函数,只创建了一个名为rowGenerator
的行,它将$min
和$max
作为parameters
并打印一行,所以如果我们要打印这样的行:|0|1|0|
那么我们将用min = 0
和max = 1
调用这个函数,如果我们想打印这样的行:|1|2|1|
然后我们将用min = 1
和max = 2
称它。
function rowGenerator($min, $max)
{
echo '<tr>';
for($i = $min; $i<=$max;$i++)
echo '<td>'.$i.'</td>';
for($i = $max-1; $i>=$min;$i--)
echo '<td>'.$i.'</td>';
echo '</tr>';
}
现在,我们可以独立打印每一行。现在我们想打印整个表格,如果我们看看我们为rowGenerator
函数做的调用,它将如下所示:
(min = 0
,max = 1
),(min = 1
,max = 2
)和(min = 0
,max = 1
)。最小值是(0,1,0)。是的,它再次是相同的模式。然后我们再次需要两个loops
从0
开始并增加数量直到达到1
,另一个从0
循环到0
。
这就是patternGenerator
功能中发生的事情。当你用不同数字的数量调用它时,function
只得到你的情况下总是0的min
和max
。
function patternGenerator($numberOfDistinct )
{
echo "<table border =\"1\" style='border-collapse: collapse'>";
$min = 0;
$max = $numberOfDistinct - 2;
for($i = $min;$i<=$max; $i++)
{
rowGenerator($i,$i+1);
}
for($i = $max-1;$i>=$min;$i--)
{
rowGenerator($i,$i+1);
}
echo '</table>';
}
这是调用patternGenerator(3)
的输出:
调用patternGenerator(5)
的输出: