>[success] ### 第五难 递归 尾递归 迭代 回调 ~~~php // 递归 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 Add3(100000) echo Add4('AddFunc', [100000]); ~~~ >[success] ### 例子2 ~~~php $list = array( function ($message, $next) { $message .= '1111'; return $next($message); }, function ($message, $next) { $message .= '2222'; return $next($message); }, function ($message, $next) { $message .= '3333'; return $next($message); }, function ($message, $next) { $message .= '4444'; return $next($message); }, ); $output = function ($message) { echo $message; }; $message = "我要通过"; $msg = array_reduce(array_reverse($list), function ($carry, $item) { return function ($message) use ($carry, $item) { if ($item instanceof \Closure) { return $item($message, $carry); } }; }, function ($message) use ($output) { return $output($message); }); //A = function($message) use ($output($message), $list['3']); //B = function($message) use (A, $list['2']); //C = function($message) use (B, $list['1']); //D = function($message) use (C, $list['0']); // D // $message '我要通过' // $carry C // $item function ($message, $next) { $message .= '1111'; return $next($message);} // return $item($message, $carry) return C('我要通过1111') // C // $message '我要通过1111' // $carry B // $item function ($message, $next) { $message .= '2222'; return $next($message);} // return $item($message, $carry) return B('我要通过11112222') // B // $message '我要通过11112222' // $carry A // $item function ($message, $next) { $message .= '3333'; return $next($message);} // return $item($message, $carry) return A('我要通过111122223333') // A // $message '我要通过111122223333' // $carry $output($message) // $item function ($message, $next) { $message .= '4444'; return $next($message);} // return $item($message, $carry) return output('我要通过1111222233334444') $msg($message); ~~~ ~~~