2013-12-18 140 views
1

我想知道如果我的算法是尾遞歸;我剛剛做這個函數在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

嗯,這個尾遞歸...找人可能感興趣的:[PHP是否優化尾遞歸?] (http://stackoverflow.com/questions/6171807/does-php-optimize-tail-recursion)。 – Theraot

回答

3

這不會是尾遞歸的一個例子,因爲在返回值之後,計算仍然在先前的遞歸調用中完成。考慮以前的StackOverflow文章(What is tail recursion?)中提供的示例。在這種情況下,「。=」操作符將完成一個連接,然後返回該函數中的結果。

爲了讓你想修改代碼打印的「輸出」變量之前進行遞歸調用