如何使这个函数尾递归?

时间:2013-12-18 20:34:21

标签: php algorithm recursion pretty-print tail-recursion

我想知道我的算法是否是尾递归的;我刚刚使用这个函数在PHP中打印一个数组:

function get_pretty_output($value, $first=true, $indent = ''){
    if (!is_array($value)) { return $value.PHP_EOL; }
    if (empty($value)) { if ($first) { return 'Array()'.PHP_EOL; } else { return preg_replace('/    /', '', $indent, 1).')'.PHP_EOL; }}
    if ($first) {
            $output = 'Array'.PHP_EOL.$indent.'('.PHP_EOL;
            $indent .='    ';
            $first = false;
    } else {
        $output = '';
    }
    reset($value);
    $key = key($value);
    return $output .= $indent . 
        '[' . 
        $key . 
        '] => ' . 
        get_pretty_output(array_shift($value), true, $indent) . 
        get_pretty_output($value, $first, $indent);
}

因为没有

$pretty_string = print_r($array, true);

也不是

ob_start(); 
var_dump($array); 
$pretty_string = ob_get_contents(); 
ob_end_clean();
当客户端与ignore_user_abort(true)(PHP 5.6)断开连接时,

似乎有效。

我甚至不知道PHP是否会受益于尾递归(我被告知它没有),但无论如何我想知道这是否是一个有效的例子。我不这么认为(它需要保存函数上下文以便在第二次调用时使用),但我似乎无法找到等效的尾递归算法。有没有我可以遵循的方法?

1 个答案:

答案 0 :(得分:3)

这不是尾递归的示例,因为在返回值之后,计算仍然在先前的递归调用中完成。考虑先前StackOverflow帖子(What is tail recursion?)中提供的示例。在这种情况下,“。=”运算符将完成连接,然后返回函数中的结果。

为了使这个尾递归,你需要在进行递归调用之前修改你的代码打印'output'变量