正确看待递归函数

简介: 实际编码过程中,我觉得尽量少用,而是使用for或while去替代它,这样会让你少走很多弯路。​

什么是递归函数

我们都知道基本上的编程语言都支持在一个函数中调用其他的函数。如果这个函数在内部调用它自己,那么我们就称这个函数为递归函数。

递归函数的作用

  • 可以执行for或while语句相同的任务
  • 有些情况可以少写代码,让代码看起来更简练
    举一个例子,数学中我们有学习过求一个正整数的阶乘。阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积。我们使用PHP语言用两种方法实现阶乘的运算,代码如下:
<?php
​
//使用递归的方式
function factorial_1($n){
  return $n == 1 ? 1 : $n * factorial($n - 1);
}
//使用while的方式
function factorial_2($n){
  $res = 1;
  while ($n > 1) {
    $res = $res * $n--;
  }
  return $res;
}
$n = 5;
echo "使用阶乘的方式:" . factorial_1($n) . "<br>";
echo "使用while的方式: " . factorial_2($n) . "<br>";

打开浏览器运行该脚本,可以得到相同的结果。观察两个函数的实现,不难发现使用阶乘的方式,代码量看起来似乎是少一些,但是也没有特别明显。

递归函数的弊端

  • 性能低于for和while,同时会占用更高的内存
  • 如果不设置递归的边界,那么就会造成死循环,直接将服务器跑崩
  • 虽然可以替代for和while的实现,但是有些情况使用递归会显得很难理解。这边举个例子(当时也是困扰苟哥我许久啊),代码实现如下:
<?php
//用两个方法实现将一个字符串逆置
​
//递归实现
function reverse_r($str) { 
  if (strlen($str)>0) {
    reverse_r(substr($str, 1)); 
  }
  echo substr($str, 0, 1);
  return; 
}
​
//for循环实现
function reverse_i($str) {
  for ($i=1; $i<=strlen($str); $i++) {
    echo substr($str, -$i, 1); 
  }
  return; 
}
​
reverse_r('Hello'); 
echo '<br />'; 
reverse_i('Hello');

虽然两个方法得到的结果是一样的,但是明显reverse_i这个方式是更好理解的,直接从字符串的最后一个位置开始逐个打印字符。而分析reverse_r这个方法,你会发现不是很好理解,如果你之前不知道一个事实——“函数内,当遇到子函数后并不是停止运行函数后面的代码,而是保存现场,去执行子函数,执行完恢复现场接着执行”,那么我猜你一定很难理解程序是怎么实现字符串逆置的。什么意思呢?就是reverse_i脚本的第9行那句代码会执行n次(n表示递归次数),但是每次执行的顺序刚好是和函数的循环顺序相反的,我们借助下图来理解reverse_i是如何被执行的:
_
上图中,右侧带数字的向下箭头表示程序实际运行的代码顺序。被不同颜色的线连接的表示一个完整的函数体(因为我们刚刚说了遇到子函数后并不是停止运行函数后面的代码,而是保存现场,去执行子函数,执行完恢复现场接着执行),因此reverse_r('hello')虽然是最先被执行的,但是它的后一句代码echo substr('hello', 0, 1) 却是最后才被执行的。最后得到的打印效果也就实现了将字符串逆置,但是用递归这个方式确实不容易被理解啊。

应该使用递归函数吗

从知识点全面性的角度,我觉得可以也应该去学习递归思想。但是在实际编码过程中,我觉得尽量少用,而是使用for或while去替代它,这样会让你少走很多弯路。

目录
相关文章
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
774 0
|
7月前
|
数据采集 人工智能 自然语言处理
Token中文新译名:「符元」——一文七个维度讲清Token的本质定义
拒绝“智元”走私语义,七维拆解 Token 物理本质,定义 AI 时代唯一真名:「符元」。
1394 2
|
6月前
|
人工智能 弹性计算 数据可视化
OpenClaw部署成本说明及一键部署指南
OpenClaw是开源智能办公助手,支持任务管理与多平台接入。本文详解其零软件费、低硬件成本(云服务器首月9.9元起)及模型调用策略(百炼新用户享7000万Token免费额度),并提供阿里云一键部署指南,全程可视化、免写代码,5分钟上线专属AI助理!
1068 15
|
6月前
|
存储 关系型数据库 分布式数据库
基于PolarDB Mem0 为 OpenClaw 构建高效记忆系统(阿里云开发者)
PolarDB Mem0 是阿里云推出的AI Agent长效记忆托管服务,100%兼容开源Mem0。它通过智能演进(自动去重、冲突消解)、跨端全局同步、多租隔离与企业级管控(存档、遗忘、差异化策略),彻底解决OpenClaw“数字囤积症”“换设备失忆”“毛坯房塌房”三大记忆难题,让Agent真正“越用越懂你”。
528 2
|
7月前
|
人工智能 自然语言处理 监控
【养龙虾保姆级教程】OpenClaw是什么?能做什么?怎么部署?
“养龙虾”是开发者对开源AI智能体框架OpenClaw的昵称——它能在本地运行,理解自然语言并直接操控电脑执行任务(如办公、开发、爬虫等),堪称可自托管的“数字员工”。本文带你零基础掌握其原理、能力与安全部署方法。
1247 10
|
9月前
|
弹性计算 小程序 对象存储
暂时不想买阿里云服务器?没关系,阿里云邀请你先免费试用
阿里云推出“云服务器免费试用”活动涵盖个人版、企业版及轻量应用服务器,满足开发者、企业及电商/Web应用开发者需求。个人版提供300元额度(3个月有效),支持8规格、7地域及20GB+200GB流量;企业版额度660元,规格更丰富,支持高可用架构。轻量服务器分2vCPU 1GiB(电商建站,海外11地域)和2vCPU 4GiB(Web/小程序开发,内地14地域)。以下是具体试用内容介绍。
|
9月前
|
人工智能 自然语言处理 数据可视化
科技云报到:RPA+Agent,为什么可以1+1>2?
科技云报道原创。RPA与Agent深度融合,推动企业自动化从“流程执行”迈向“智能决策”。Agent负责认知与规划,RPA专注精准操作,二者协同实现业务场景的灵活应变与高效交付,助力企业降本增效、构建数字竞争力。
407 1
|
9月前
|
运维 安全 专有云
【操作指南】企业IT管理中,如何通过IP地址查询定位快速溯源异常终端?
在企业IT管理中,面对异常登录或安全告警,如何快速溯源?本文分享一套基于IP地址查询的标准化操作指南:通过提取异常IP、解析属性、判断合理性,并结合内部系统定位责任终端。依托内网部署的IP离线库,实现高效、稳定、可批量的终端溯源,助力企业构建扎实的安全与运维响应能力。
|
11月前
|
存储 关系型数据库 MySQL
MajorRAG文件内容提取实现分析(2/3)
一个RAG项目,全文共三个部分:MajorRAG概述、MajorRAG文件内容提取实现分析、MajorRAG聊天问答系统实现分析。 1)第一次做RAG,欢迎带着指导意见评论 2)希望指出不足时可以附带替换方法 博客地址:https://zhangcraigxg.github.io
458 1
|
11月前
|
数据挖掘
医院随访系统源码,三级随访管理流程解析
患者院后随访管理系统是一款智能化医疗平台,实现从“院内诊疗”到“院外康复”的全程闭环管理。系统支持三级随访、多途径回访、自动提醒、数据分析与满意度调查,提升随访效率与医疗服务质量,推动医疗服务延伸至院外,助力构建高效、规范的随访生态。
692 1

热门文章

最新文章