如何获得数组中每个数字的阶乘值?

时间:2018-08-17 21:18:46

标签: php function lambda functional-programming

我正在尝试通过使用此方法获取数组中每个项目的阶乘值,但这仅输出一个值 有谁能帮助我找到我做错了什么?

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

1 个答案:

答案 0 :(得分:4)

您将需要一点递归,因此,您需要通过引用将lambda函数传递给自身:

%include "asm_io.inc"

segment .data

segment .bss

segment .text
    global secret_func
secret_func:
    enter 0,0
    push ebx
    mov     ebx, [ebp + 8] ; first argument by gcc x86 calling convention
    cmp     ebx, 1
    jne     while_init
    jmp     case_one

while_init:
    mov     ecx, 2

while:
    cmp     ecx, ebx
    jge     case_two

    xor     edx, edx
    mov     eax, ebx
    div     ecx

    cmp     edx, 0
    je      case_one

    add     ecx, 1
    jmp     while

case_one:
    mov     eax, 0
    jmp     end

case_two:
    mov     eax, 1

end:
    mov ebx, eax
    pop ebx

    leave
    ret

输出:

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 ) 中进行其他计算,则可以会很方便,但是如果您只想使用lambda函数创建具有范围的新数组,则可以执行此操作(利用我们已经创建的同一lambda):

mathh()

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

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