【问题标题】:How can I make this function tail recursive?我怎样才能使这个函数尾递归?
【发布时间】:2014-01-07 04:54:23
【问题描述】:

我想知道我的算法是否是尾递归的;我刚刚制作了这个函数来漂亮地打印 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 是否从尾递归中受益(有人告诉我没有),但无论如何我想知道这是否是一个有效的例子。我不这么认为(它需要保存函数上下文以在第二次调用时使用),但我似乎无法找到等效的尾递归算法。有没有我可以遵循的方法?

【问题讨论】:

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


【解决方案1】:

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

要使这个尾递归,您需要在进行递归调用之前修改您的代码打印“输出”变量

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 2014-01-05
    • 1970-01-01
    • 2016-03-07
    • 2021-10-06
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多