金字塔打印是經典編程練習,考察循環控制、字符串拼接、邏輯思維。本文提供兩種實現:通用遞歸函數(支持正序/倒序、行數驗證)和簡潔雙重循環(正序/倒序),均輸出 HTML 友好格式。
<?php
/**
* 輸出金字塔
* @param int $rows 行數 (1-20)
* @param bool $ascending true=正序(尖朝上), false=倒序(尖朝下)
* @return string HTML 字符串
*/
function pyramid($rows = 9, $ascending = true) {
// 參數驗證
if ($rows < 1 || $rows > 20) return '行數必須在 1-20 之間';
if ($rows != (int)$rows) return '行數必須為整數';
$str = '';
$range = $ascending ? range(1, $rows) : range($rows, 1);
foreach ($range as $i) {
$str .= '<br/>';
// 左側空格 (居中對齊)
$spaces = $rows - $i;
$str .= str_repeat(' ', $spaces * 2); // *2 近似字符寬度
// 星號
$stars = 2 * $i - 1; // 1,3,5,7...
$str .= str_repeat('* ', $stars);
}
return $str;
}
// 使用示例
echo pyramid(9, true); // 正序金字塔
echo '<hr>';
echo pyramid(9, false); // 倒序金字塔
?>
<?php
$rows = 10;
for ($i = 1; $i <= $rows; $i++) {
// 空格
for ($s = $rows; $s >= $i; $s--) echo ' ';
// 星號
for ($k = 1; $k <= 2*$i-1; $k++) echo '* ';
echo '<br/>';
}
?>
<?php
$rows = 10;
for ($i = $rows; $i >= 1; $i--) {
for ($s = $rows; $s >= $i; $s--) echo ' ';
for ($k = 1; $k <= 2*$i-1; $k++) echo '* ';
echo '<br/>';
}
?>
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
| 變體 | 修改點 |
|---|---|
| 空心金字塔 | 內層循環判斷首尾行或首尾列輸出 *,其餘輸出空格 |
| 數字金字塔 | 星號替換為遞增數字或行號 |
| 字符金字塔 | 支持自定義字符集 (如 #, @, ♥) |
| 帶顏色 | 用 * 包裹 |
<?php
function hollow_pyramid($rows) {
for ($i = 1; $i <= $rows; $i++) {
echo str_repeat(' ', ($rows-$i)*2);
for ($k = 1; $k <= 2*$i-1; $k++) {
if ($k == 1 || $k == 2*$i-1 || $i == $rows) echo '* ';
else echo ' ';
}
echo '<br/>';
}
}
hollow_pyramid(6);
?>
str_repeat() 替代內層循環拼接,性能更好、代碼更簡潔。 或 CSS white-space: pre 保持佈局。