3

私は次のような出力を与えるプログラムを作成しようとしています:

バツ

xx

xxx

xxxx

xxxxx

xxxx

xxx

xx

バツ

私は次のような同様のプログラムを持っています:

<?php
    $n = 4;                                     
    $R[] = '*';                                  
    $w = 1;                                     
        for( $c=1; $c<=$n; $c++ ){             
            $R[] = '*'.str_repeat( '*',$w );  
            $w = $w+1;                       
        }        
    print '<pre>'.implode( "\n",$R ).'</pre>';  
?>

しかし、私は関数を使用して、より簡単なコードのために他のループを作成する必要があります。5列目以降も減らす必要があります。よろしくお願いします...

4

5 に答える 5

4

問題の説明を考えると、より洗練された方法であるため、再帰を使用します。

function hump($n, $i = 1)
{
        echo str_repeat('*', $i), PHP_EOL;
        if ($i < $n) {
                hump($n, $i + 1);
                echo str_repeat('*', $i), PHP_EOL;
        }
}

hump(5);

各呼び出しで 1 つのレベルを出力し、トップに到達するまで次のレベルを出力するために自分自身を呼び出します。スタックが巻き戻されると、同じレベルが再度出力されます。

パフォーマンスやメモリの最適化のために、再帰ではなくループを使用することをお勧めします。

于 2012-09-25T06:54:53.163 に答える
3
<?php
function drawPyramid($length) {
    for ($i = 1; $i <= $length; ++$i) {
        echo str_repeat("x", $i) . "\n";
    }
    for ($i = $length - 1; $i > 0; --$i) {
        echo str_repeat("x", $i) . "\n";
    }
}

drawPyramid(3);
echo "\n";
drawPyramid(5);
于 2012-09-25T06:50:00.170 に答える
2

素敵な宿題。さまざまな例をすべて見ることができてうれしいです。

1ライナーはどうですか?

for ($i=1; $i<$loops*2; $i++) echo str_repeat('*',($i > $loops ? ($loops * 2) - $i : $i)) . '<br>';
于 2012-09-25T07:21:41.537 に答える
2

これは再帰的な解決策で、for ループを完全に取り除きます。

function addLevel(&$array, $currentDepth, $maxDepth)
{
    $array[] = str_repeat('*', $currentDepth);
    if($currentDepth < $maxDepth)
    {
        addLevel($array, $currentDepth + 1, $maxDepth);
        $array[] = str_repeat('*', $currentDepth);
    }
}

$R= array();

addLevel($R, 1, 5);

print '<pre>'.implode( "\n",$R ).'</pre>';

物事に3つのパラメーターがあることは正確ではありませんが、これを行うクラスがなければ、グローバル変数を使用する必要があり、さらに悪いことです。

于 2012-09-25T06:55:48.590 に答える
2

echo "<pre>";
echo drawOutput(5, "x");
echo drawOutput(5, "x ");
echo drawOutput(5, "x ", " "); // left padding
echo drawOutput(5, "@-^-@ ", " "); // left padding

出力

x
xx
xxx
xxxx
xxxxx                          <----------------- what you want 
xxxx
xxx
xx
x


x 
x x 
x x x 
x x x x 
x x x x x                      <----------------- Space it out
x x x x 
x x x 
x x 
x 


    x 
   x x 
  x x x 
 x x x x 
x x x x x                      <----------------- Add some padding
 x x x x 
  x x x 
   x x 
    x 



    @-^-@ 
   @-^-@ @-^-@ 
  @-^-@ @-^-@ @-^-@ 
 @-^-@ @-^-@ @-^-@ @-^-@ 
@-^-@ @-^-@ @-^-@ @-^-@ @-^-@ 
 @-^-@ @-^-@ @-^-@ @-^-@ 
  @-^-@ @-^-@ @-^-@ 
   @-^-@ @-^-@ 
    @-^-@ 

使用する機能

function drawOutput($length, $str = "* ", $lpad = null) {
    $x = array();
    for($n = $i = $length; $i >= 0; $i --) {
        $x[] = ($lpad ? str_repeat($lpad, $i) : null) . str_repeat($str, $n - $i) . "\n";
    }
    return implode($x) . implode(array_slice(array_reverse($x), 1));
}
于 2013-01-09T16:46:48.230 に答える