2

我正在尝试像下面的模式一样回应星星和零

*
***0
******00
**********000

星号的长度增加了一个因子(以气球的方式)——之前的星号数量加上当前的迭代次数。

  • 迭代 1: 1 (0 + 1)
  • 迭代 2:3 (1 + 2)
  • 迭代 3: 6 (3 + 3)
  • 迭代 4: 10 (6 + 4)
  • 迭代 5: 15 (10 + 5)
  • ETC

零点的长度增加了一个静态因子。

  • 迭代 1:0
  • 迭代 2:1
  • 迭代 3:2
  • 迭代 4:3
  • 迭代 5:4
  • ETC

我的代码目前如下所示:

for ($i=0; $i<=10; $i++)
{   
    echo "*";
    for ($j=0; $j<$i; $j++)
    {   
       echo "*";
    }
    for ($z=0; $z<$i; $z++)
    {
        echo "0";
    }       
    echo "</br>";    
} 

但是我得到了这个结果:

*
**0
***00
****000
*****0000
******00000
4

5 回答 5

6

星数由三角形数字 , 1,1+2表示1+2+3$i您希望通过每次迭代来增加内部循环最大值:

$k = 0;
for ($i=1; $i<=10; $i++)
{
    $k += $i;
    for ($j=1; $j<=$k; $j++)
    {   
       echo "*";
    }
    ...
}

这也是一个很好的例子,你的循环应该用1而不是初始化0,因为它更直观。 0当您使用数组时,基于 - 的循环效果最好。

于 2013-03-04T20:52:55.277 回答
1

我认为这样的事情更有效;您可以缓存当前的星和零序列。

$cache_star = "";
$cache_zero = "";
for ($i=1; $i<=10; $i++)
{
    for ($j=1; $j<=$i; $j++)
    {   
       $cache_star .= "*";
    }
    echo $cache_star.$cache_zero;
    $cache_zero .= "0";
}
于 2013-03-04T20:59:27.287 回答
0

这是我得到的:

for($i = 1; $i != 5; $i++)
{
    $triangle = (0.5 * $i) * ($i + 1);
    echo str_repeat('*', $triangle) . str_repeat('0', $i) . PHP_EOL;
}

使用公式0.5n(n + 1)- 三角形数字公式。

示例输出:

*0
***00
******000
**********0000
于 2013-03-04T21:05:42.943 回答
0

我非常喜欢@jordandoyle 的方法,但我通过从$i第二个str_replace()..中减去 1 来纠正零模式。

代码:(演示

$number = 5;
for ($i = 1; $i <= $number; ++$i) {
    echo str_repeat('*', $i * .5 * ($i + 1))
         . str_repeat('0', $i - 1)
         . PHP_EOL;
}

输出:

*
***0
******00
**********000
***************0000

如果此答案与较早的答案相比缺乏显着的唯一性,我将包括递归方法(而不是经典循环)。

代码:(演示

function printLines($i, $lines = [], $newline = PHP_EOL) {
    if ($i > 0) {
        array_unshift(
            $lines,
            str_repeat('*', $i * .5 * ($i + 1))
                . str_repeat('0', $i - 1)
        );
        printLines(--$i, $lines);
    } else {
        echo implode($newline, $lines);
    }
}

printLines(5);

您甚至可以复制上一行并将其插入下一行的中间以形成所需的图案。这是@CoertMetz 的嵌套循环技术的函数式等价物。

代码:(演示

$number = 5;
$line = '';
for ($i = 1; $i <= $number; ++$i) {
    echo (
             $line = str_repeat('*', $i)
                 . $line
                 . ($i > 1 ? '0' : '')
         )
         . PHP_EOL;
}

所有上述技术都提供相同的结果。

于 2022-02-18T11:12:24.403 回答
-1

闻起来像家庭作业......但是好吧,这个怎么样:

$star = "*";

echo $star."\n";

    for ($i=0; $i<=10; $i++)
    {   
        $star = $star."**";
        echo $star;

        echo str_repeat("0", $i+1);

        echo "\n";    
    } 

结果:

*
***0
*****00
*******000
*********0000
***********00000
*************000000
***************0000000
*****************00000000
*******************000000000
*********************0000000000
***********************00000000000

演示:

http://sandbox.onlinephpfunctions.com/code/583644f782005adb9e018b965cbbdefaf63c7c79

于 2013-03-04T20:54:24.557 回答