【问题标题】:How to get the factorial value of each number in an array?如何获取数组中每个数字的阶乘值?
【发布时间】:2019-01-24 22:42:13
【问题描述】:

我正在尝试使用此方法获取数组中每个项目的阶乘值,但这仅输出一个值 任何机构都可以帮助我找到我做错的地方吗?

   function mathh($arr, $fn){


            for($i = 1; $i < sizeof($arr); $i++){
            $arr2 = [];
          $arr2[$i] = $fn($arr[$i]);

        }
        return $arr2;
    }

    $userDefined = function($value){
       $x = 1;
         return $x = $value * $x;


    };

        $arr = [1,2,3,4,5];
        $newArray = mathh($arr, $userDefined);

        print_r($newArray);

【问题讨论】:

  • 嘿,Jay,我实际上正在尝试学习 lambda 函数,我知道这只能使用单个函数来完成,但我想知道这是否可行?如果是,那么需要回答,以便我可以学习更多函数式编程
  • 首先,当我尝试运行你的代码时,$x 是未定义的。
  • 我认为在 for 循环中初始化 $arr2 会是个问题。
  • 看起来mathh 可能正在尝试重新实现array_map。你知道array_map吗?

标签: php function lambda functional-programming


【解决方案1】:

您将需要一点递归,所以为了做到这一点,您需要通过引用将 lambda 函数传递给自身:

function mathh($arr, $fn){
    $arr2 = []; // moved the array formation out of the for loop so it doesn't get overwritten
    for($i = 0; $i < sizeof($arr); $i++){ // starting $i at 0
        $arr2[$i] = $fn($arr[$i]);
    }
    return $arr2;
}

$userDefined = function($value) use (&$userDefined){ // note the reference to the lambda function $userDefined
   if(1 == $value) {
       return 1;
   } else {
       return $value * $userDefined($value - 1); // here is the recursion which performs the factorial math
   }
};

$arr = [1,2,3,4,5];
$newArray = mathh($arr, $userDefined);
print_r($newArray);

输出:

Array
(
    [0] => 1
    [1] => 2
    [2] => 6
    [3] => 24
    [4] => 120
)

我想对此进行扩展,因为您本质上(在这种情况下)是在创建一个数组映射。如果您在函数mathh() 中进行额外计算,这可能会很方便,但如果您只想使用 lambda 函数创建一个具有范围的新数组,您可以这样做(利用我们已经创建了相同的 lambda):

$mapped_to_lambda = array_map($userDefined, range(1, 5));
print_r($mapped_to_lambda);

您将获得相同的输出,因为映射数组的范围 (1,5) 与您的原始数组相同:

Array
(
    [0] => 1
    [1] => 2
    [2] => 6
    [3] => 24
    [4] => 120
)

【讨论】:

  • 哇。在引用中将 lambda 传递给自身是一个不错的技巧!??
  • 哇,杰伊你真棒,非常感谢你,这就是我想做的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2021-05-29
  • 1970-01-01
  • 2015-02-03
  • 2014-03-24
  • 1970-01-01
相关资源
最近更新 更多