递归 尾递归 迭代 回调

小知识点
  • 函数式编程有一个概念,叫做柯里化(currying),意思是将多参数的函数转换成单参数的形式

  • 如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的.当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归

例子
// 递归
function Add($num)
{
    switch ($num) {
        case 1:
            return $num;
        default:
            return $num + Add($num - 1);
    }
}

//尾递归
function Add2($num, $result = 0)
{
    switch ($num) {
        case 0:
            return $result;
        default:
            return Add2($num - 1, $result + $num);
    }
}

//迭代
function Add3($num)
{
    $result = 0;
    while ($num != 0) {
        $result += $num;
        $num--;
    }
    return $result;
}

//回调
function AddFunc($num, $result = 0)
{
    if ($num == 0) {
        return $result;
    }
    return function () use ($num, $result) {
        return AddFunc($num - 1, $result + $num);
    };
}

function Add4($callback, $num)
{
    $result = call_user_func_array($callback, $num);
    while (is_callable($result)) {
        $result = $result();
    }
    return $result;
}

echo Add(5);
echo Add2(5);
echo Add3(5);
echo Add4('AddFunc', [100000]);
相关阅读
  • 尾递归

  • PHP-无限级分类(迭代法创建)

你可能感兴趣的:(递归 尾递归 迭代 回调)