1

是否可以在不使用循环的情况下将此代码更改为函数?

$start = 80;
for ($i = 1; $i <= 10; $i++) {
    $start = $start * 1.5;
    echo "level ".$i.": ".$start."<br>";
}
function generate($start, $level){
// some code
    return $start;
}
4

4 回答 4

3

对于 1 级,您有:

$start = $start * 1.5;

因为级别 2$start是级别 1 的结果,所以:

$start = ($start * 1.5) * 1.5;

这与

$start = $start * 1.5 * 1.5;

并且可以简化为

$start = $start * pow(1.5, $level);

最后,您的功能应如下所示:

function generate($start, $level){
    return $start * pow(1.5, $level);
} 
于 2013-06-23T09:36:39.247 回答
2

如果您想获得相同的结果(包括打印到屏幕的关卡),您可以使用以下代码:

function generate2($start, $from,$to){
if($from==$to+1)
    return 1.5;
$tmp=$start*1.5;
echo "level ". ($from).": ".$tmp."<br>";
return 1.5*generate2($tmp,$from+1,$to);
}

或这个:

<?php
define ("MAX_LEVEL",10) ;

function generate($start, $level)
{
  if($limit==0)
    return 1.5;
  $tmp=$start*1.5;
  echo "level ". (MAX_LEVEL-$level+1).": ".$tmp."<br>";
  return 1.5*generate($tmp,$level-1);
}

这里有一些检查代码:

 $start = 80;//<=================your code
for ($i = 1; $i <= 10; $i++) {
    $start = $start * 1.5;
    echo "level ".$i.": ".$start."<br>";
}
echo"---------------------------- <br>";
generate(80,10);//<====================my code
echo"---------------------------- <br>";
generate2(80,1,10);
 ?>

如果您不需要打印,您可以使用非常简单的功能:

function generate($start, $level){
    return $start * pow(1.5, $level);
} 
于 2013-06-23T11:00:55.603 回答
0

或者,如果您只需要输出 $start:

function generate($start, $limit)

{

$start = $start * 1.5;  
echo $start."<br>";
if($limit>1)
return(generate($start,$limit-1));
}   
generate(80,10);

我的问题 - 如何正确回显 $level,没有第三个参数(0,在这种情况下应该增加,不减少:))?:)

编辑:我想知道更好的解决方案,它会做同样的事情,有两个参数:

   function generate2($start, $limit,$base)
   {
        $start = $start * 1.5;  
        echo "level ".$base.": ".$start."<br>";
        if($base<$limit)
            return(generate2($start,$limit,$base+1));
   }   
   generate2(80,10,1);

最后编辑:

function generate($start, $limit,$i=0)

{
$i++;
$start = $start * 1.5;  

echo "level ".$i.": ".$start."<br>";
if($limit>1) 
{

    return(generate($start,$limit-1,$i));

}
}   
generate(80,10);

作为对我自己的回答。:) 请测试它(在否决票之前:)),并让我知道问题......哦,我明白了 - OP 只想要 1 个结果,哈哈......问题对我来说并不清楚(不仅仅是对我来说) , 它似乎) :)

于 2013-06-23T09:35:03.380 回答
0

给你,一个没有“可见”循环的解决方案:

generate(80,10);
function  generate($start, $level){
    $i=1; // Just a var
    $array = array_fill(0, $level, $start); // create an array with $level elements, with value $start
    array_map(function($v)use(&$i){ // Loop through the array and use $i
        echo "Level $i: ".(array_product(array($v, pow(1.5, $i++))))."<br>"; // Some basic math and output
    }, $array);
}

在线演示

请注意,您需要PHP 5.3+,因为此函数使用匿名函数

于 2013-06-23T09:28:41.050 回答