为每个级别的建筑物生成资源

时间:2013-06-23 08:25:47

标签: php

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

$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 个答案:

答案 0 :(得分: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);
} 

答案 1 :(得分: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);
} 

答案 2 :(得分: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);
}

Online demo

  

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

答案 3 :(得分: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个结果,哈哈... 我不清楚问题(而且不仅仅是对我而言):)