利用巢狀迴圈列印金字塔是經典邏輯訓練。本文提供空心金字塔(僅邊框)與實心金字塔兩種演算法完整實作,並解析迴圈變數控制邏輯。
*
* *
* *
* *
* * * * *
<?php
for ($i = 1; $i <= 5; $i++) {
switch ($i) {
case 1: echo " * "; break;
case 2: echo " * * "; break;
case 3: echo "* *"; break;
case 4: echo "* *"; break;
case 5: echo "* * * * * "; break;
}
echo "
";
}
?>
缺點: 不具通用性,層數變更需重寫所有 case。
$i 行(1-indexed):前導空格 n - i,內容寬度 2*i - 1*,中間為空格*<?php
function printHollowPyramid($rows) {
for ($i = 1; $i <= $rows; $i++) {
// 1. 前導空格
for ($s = 1; $s <= $rows - $i; $s++) {
echo " "; // HTML 空格
}
// 2. 星號與內部空格
for ($j = 1; $j <= 2 * $i - 1; $j++) {
if ($j == 1 || $j == 2 * $i - 1 || $i == $rows) {
echo "*";
} else {
echo " "; // 內部空隙
}
}
echo "
";
}
}
printHollowPyramid(5);
?>
<?php
function printSolidPyramid($rows) {
for ($i = 1; $i <= $rows; $i++) {
// 前導空格
for ($s = 1; $s <= $rows - $i; $s++) {
echo " ";
}
// 全星號
for ($j = 1; $j <= 2 * $i - 1; $j++) {
echo "*";
}
echo "
";
}
}
printSolidPyramid(5);
/*
輸出:
*
***
*****
*******
*********
*/
?>
| 行號 $i | 前導空格 $rows-$i | 星號數 2*$i-1 | 空心判斷 |
|---|---|---|---|
| 1 | 4 | 1 | 首尾同位置 → * |
| 2 | 3 | 3 | 位置 1,3 → *;位置 2 → 空格 |
| 3 | 2 | 5 | 位置 1,5 → *;位置 2-4 → 空格 |
| 4 | 1 | 7 | 位置 1,7 → *;位置 2-6 → 空格 |
| 5 | 0 | 9 | 底行全 * |
<?php
function printDiamond($rows) {
// 上半部(含中線)
for ($i = 1; $i <= $rows; $i++) {
for ($s = 1; $s <= $rows - $i; $s++) echo " ";
for ($j = 1; $j <= 2 * $i - 1; $j++) echo "*";
echo "
";
}
// 下半部
for ($i = $rows - 1; $i >= 1; $i--) {
for ($s = 1; $s <= $rows - $i; $s++) echo " ";
for ($j = 1; $j <= 2 * $i - 1; $j++) echo "*";
echo "
";
}
}
printDiamond(5);
/*
*
***
*****
*******
*********
*******
*****
***
*
*/
?>
或 `` 標籤包裹
保留原始格式,適合終端機風格輸出<?php
echo "";
printHollowPyramid(10);
echo "
";
?>
str_repeat('*', $count) 可減少內層迴圈<?php
// str_repeat 優化版
function printSolidPyramidFast($rows) {
for ($i = 1; $i <= $rows; $i++) {
echo str_repeat(" ", $rows - $i);
echo str_repeat("*", 2 * $i - 1);
echo "
";
}
}
?>
金字塔列印雖簡單,但完美鍛鍊了「行號與內容寬度的數學關係」、「邊界條件判斷」、「字串輸出控制」三大核心程式設計能力。