【问题标题】:I need to combine "functions" with "for loop" with php我需要将“函数”与“for循环”与php结合起来
【发布时间】:2012-09-16 15:35:50
【问题描述】:

我正在尝试制作一个提供如下输出的程序:

x

xx

xxx

xxxx

xxxxx

xxxx

xxx

xx

x

我有一个类似的程序是:

<?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 行之后减少它。 提前谢谢...

【问题讨论】:

  • “我需要使用一个函数” ... 哪个部分?

标签: php function loops for-loop


【解决方案1】:

鉴于问题描述,我只会使用递归,因为它是一种更优雅的方式。

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);

它在每次调用中打印一个级别,并调用自己打印下一个级别,直到到达顶部;当堆栈展开时,它会再次打印相同的级别。

为了性能和/或内存优化,建议使用循环而不是递归。

【讨论】:

  • 是的,这也适用于 urahara。它比我需要的复杂一点,但谢谢。
  • @user1694673 如果要求是高性能,我会选择两个 for 循环,但我觉得这样更优雅:)
  • 我必须说,只要不需要递归,就不要使用递归。递归调用很慢,因为它们消耗大量内存
  • @RonaldBorla 是否应该使用递归取决于情况而不是这样的公理。此外,即使 PHP 还不支持它并且这个问题本身更难编写,尾递归代码也不会出现这样的内存问题。
【解决方案2】:
<?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);

【讨论】:

  • 有点像,但每一行必须增加一个“x”直到“xxxxx”,而不是减少到一个“x”。
  • 确实如此。您可能在浏览器中看不到它,请将\n 替换为&lt;br&gt; 或在&lt;pre/&gt; 中呈现它。
  • 它就是这样做的,不是吗?
  • 非常感谢。正是我需要的。
  • 太棒了,请不要忘记在可用时将问题标记为已关闭,以便妥善处理。
【解决方案3】:

这是一个递归解决方案,完全摆脱了 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 个参数并不完全整洁,但是如果没有一个类来执行此操作,您将需要使用全局变量,这更糟糕。

【讨论】:

    【解决方案4】:

    很好的家庭作业。很高兴看到所有不同的例子。

    1-liner 怎么样?

    for ($i=1; $i<$loops*2; $i++) echo str_repeat('*',($i > $loops ? ($loops * 2) - $i : $i)) . '<br>';
    

    【讨论】:

      【解决方案5】:

      示例

      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));
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 1970-01-01
        • 2014-09-08
        • 2021-12-22
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        相关资源
        最近更新 更多