>[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);
~~~
~~~
- 西天取经(九九八十一难)
- 第一难 WebUpload文件上传
- 第二难 UEditor文本编辑器
- 第三难 ThinkPHP自定义分页模板
- 第四难 VerificationCode验证码
- 第五难 递归 尾递归 迭代 回调
- 第六难 GRPC服务端和客户端
- 第七难 PHP小笔记
- 第八难 yum安装Apache PHP MySQL
- 第九难 高性能MySQL简介
- 第十难 DIV+CSS简介
- 十一难 留言板
- 十二难 正则表达式
- 十三难 PHPMailer邮件发送
- 十四难 日历
- 十五难 百度地图
- 十六难 加密
- 十七难 筛选url跳转
- 十八难 图片转ASCII码图
- 十九难 环境配置
- 二十难 开发工具LiteIDE
- 二一难 开发工具2
- 二二难 准备工作
- 二三难 第一个应用程序 Hello World
- 二四难 语法结构
- 二五难 命名规则
- 二六难 变量
- 二七难 常量
- 二八难 常量计数器 iota
- 二九难 判断语句if
- 三十难 择语句switch
- 三一难 循环语句 for
- 三二难 遍历 range
- 三三难 跳转语句goto, break, continue
- 三四难 make, len, cap, new, nil
- 三五难 数组 array
- 三六难 切片 slice
- 三七难 集合 map
- 三八难 通道 channel
- 三九难 函数 function
- 四十难 结构 struct
- 四一难 方法 method
- 四二难 接口 interface
- 四三难 指针
- 四四难 异常
- 四五难 模板应用
- 四六难 Go安装GRPC服务端和客户端
- 四七难 安装虚拟机软件(VirtualBox)
- 四八难 安装Centos7
- 四九难 --help
- 五十难 目录文件
- 五一难 系统磁盘
- 五二难 Shell
- 五三难 Nginx安装配置
- 五四难 PHP安装配置
- 五五难 MySQL安装配置
- 五六难 yum 安装 Apache PHP MySQL
- 五七难 安装gRPC
- 五八难 安装memcache
- 五九难 介绍
- 六十难 DIV + CSS
- 六一难 浏览器兼容问题
- 六二难 书写风格(Js中写Html)
- 六三难 NodeJs(Express框架pug模板引擎)
- 六四难 SQL优化工具SQLAdvisor
- 六五难 JpGraph图表
- 六六难 日期排序
- 六七难 大部分问题解决方法
- 六八难 小趣味
- 六九难 编程语言排行榜
- 七十难 PHP编辑器
- 七一难 Key
- 七二难 手动定位和自动定位当前文件位置
- 七三难 关闭代码提示
- 七四难 配置XDebug
- 七五难 配置FTP
- 七六难 配置SSH
- 七七难 Notepad++
- 七八难 XShell 和 Xftp
- 七九难 PHPExcel导入导出
- 八十难 编程科普
- 八一难 ThinkPHP5.1新特性: 容器
- 大雷音寺(领取经书)