- PHP 教程
- PHP - 首页
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混合
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与 I/O
- PHP - 数学函数
- PHP - Heredoc 和 Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期和时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 比较运算符(飞船运算符)
- PHP 控制语句
- PHP - 决策制定
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理 CSV 文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象 PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - Final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET 和 POST
- PHP - 文件上传
- PHP - Cookie
- PHP - Session
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 清理输入
- PHP - Post-Redirect-Get (PRG)
- PHP - 闪存消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 编码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 针对 C 开发人员
- PHP - 针对 Perl 开发人员
- PHP - 框架
- PHP - Core PHP 与框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望
- PHP - Use 语句
- PHP - 整数除法
- PHP - 已弃用的特性
- PHP - 已删除的扩展和 SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP - 递归函数
递归函数是指这样一种函数,它会一直调用自身,直到满足某个条件。在 PHP 中,可以定义递归函数。
当某个问题用自身来定义时,就会用到递归。
有时,使用迭代方法解决问题可能会很繁琐。递归方法为看似复杂的问题提供了非常简洁的解决方案。
PHP 中的递归与 C 和 C++ 中的非常相似。
递归函数特别用于遍历嵌套数据结构以及搜索或排序算法。
二叉树遍历、堆排序和查找最短路径是一些使用递归的例子。
使用递归计算阶乘
递归最流行的例子是计算阶乘。阶乘在数学上定义为:
n! = n × (n-1)!
可以看出,我们使用阶乘本身来定义阶乘。因此,这是一个适合编写递归函数的例子。
让我们展开上述定义,计算 5 的阶乘值
5! = 5 × 4! 5 × 4 × 3! 5 × 4 × 3 × 2! 5 × 4 × 3 × 2 × 1! 5 × 4 × 3 × 2 × 1 = 120
虽然我们可以使用循环来执行此计算,但它的递归函数涉及连续调用自身,每次递减数字,直到它达到 1。
示例
以下是计算阶乘的递归函数。
<?php function factorial ($n) { if ($n == 1) { echo $n . PHP_EOL; return 1; } else { echo "$n * "; return $n*factorial($n-1); } } echo "Factorial of 5 = " . factorial(5); ?>
它将产生以下 **输出**:
5 * 4 * 3 * 2 * 1 Factorial of 5 = 120
使用递归进行二分查找
让我们再看一个例子来了解递归是如何工作的。手头的问题是检查给定数字是否在一个列表中。
虽然我们可以使用 **for** 循环并比较每个数字来对列表中的某个数字进行顺序搜索,但顺序搜索效率不高,尤其是在列表过大的情况下。在这里,我们可以使用二分查找算法,该算法检查索引 'high' 是否大于索引 'low'。根据 'mid' 变量中存在的值,再次调用该函数以搜索元素。
我们有一个数字列表,按升序排列。然后,我们找到列表的中点,并将检查限制为中点的左侧或右侧,具体取决于所需数字是否小于或大于中点的数字。
下图显示了二分查找的工作原理:
示例
以下代码实现了递归二分搜索技术:
<?php function bsearch($my_list, $low, $high, $elem) { if ($high >= $low) { $mid = intval(($high + $low)/2); if ($my_list[$mid] == $elem) return $mid; elseif ($my_list[$mid] > $elem) return bsearch($my_list, $low, $mid - 1, $elem); else return bsearch($my_list, $mid + 1, $high, $elem); } else return -1; } $list = [5,12,23, 45, 49, 67, 71, 77, 82]; $num = 67; $result = bsearch($list,0,count($list)-1, $num); if ($result != -1) echo " Number $num found at index " . $result; else echo "Element not found!"; ?>
它将产生以下 **输出**:
Number 67 found at index 5
您可以检查给定列表中存在的不同数字以及列表中不存在的数字的输出。
广告