递归与循环

2023-05-16

 原创文章,转载请注明: 转载自始终不够

本文链接地址: 递归与循环

转载请注明:始终不够 » 递归与循环

大一学C++的时候,老师说过递归与循环是可以相互转化的,当时好像是用来两重循环解决递归问题,算法的复杂度依然是O(n)。最近发现可以通过模拟实现栈结构通过一重循环实现非递归算法。

递归必须满足以下两个条件:

  • 在每一次调用自己时,必须是(在某种意义上)更接近于解;
  • 必须有一个终止处理或计算的准则。

首先我们给出一个最简单的递归实现,算法的目的是为了得到一个大于等于10的数字。

1
2
3
4
5
6
7
function recursion( $data ){
     if ( $data > 10){
         return $data ;
     }
 
     return recursion( $data + 1);
}

以上代码,当$data <= 10时,调用自己并累加1。

非递归算法实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function noRecursion( $data ){
     $result = null;
     $stack new SplStack();
     $stack ->push( $data );
     do {
         if (! $stack ->valid())  break ;
 
         $result $stack ->pop();
         if ( $result > 10){
             return $result ;
         }
 
         $stack ->push( $result + 1);
     } while (true);
 
     return $result ;
}

为了保存每次循环产生的中间结果,我们将结果压入一个栈中,等待下次处理。SplStack类为php提供的SPL标准栈结构。

 

我们知道,递归算法虽然写起来要比用循环来解决问题更加方便,但它所带来的性能问题也是不能忽略的。由于每次递归调用都需要存储本次执行产生的中间结果并压入栈中等待递归返回,对内存和cpu的消耗都非常高。使用模拟栈实现的非递归算法,能够带来本质上的性能提升,且编码并不是非常复杂。原则上推荐在能够使用以上算法实现非递归算法的情况下,尽量少用递归算法。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归与循环 的相关文章

  • 回溯算法的理解与使用

    最近在做题的过程中发现很多我不会的题目的解决方法都使用了回溯算法的思想 xff0c 说明我对这个算法目前掌握的还不够牢固 xff0c 因此今天花时间来好好了解这个算法 回溯算法是一种算法思想 xff0c 而递归则是具体的代码结构 就我的学习
  • Kmeans基本思想以及和SVM的区别

    由于最近要用到该算法 xff0c 但是发现算法的思想基本忘掉了 xff0c 只知道是聚类算法 xff0c 因此又回头去学习了一番 xff0c 记录下学习的感受 xff0c 方便以后复习 Kmeans算法的基本思想 xff1a 看如下图 xf
  • HTTPConnection与JSON应用实例

    JSON xff1a 一种轻量级的数据交换格式 JSONObject xff1a 一个json对象 包含一对儿 Key Value 数值 xff0c 在Key和Value之间是以逗号 分隔 JSONStringer xff1a json文本
  • VS(Visual Studio)与VC(Visual C++)对应关系

    opencv 2 4 10 gt vc10 vc11 vc12 opencv 2 4 13 gt vc11 vc12 opencv 3 4 0 gt vc14 vc15 opencv 3 4 1 gt vc14 vc15 Visual St
  • 如何在win10下用Anaconda安装gym(强化学习)

    默认已经安装好Anaconda和pycharm 配置libssl 1 1 x64 ddl libcrypto 1 1 x64 dll 把路径 Anaconda3 Library bin 下面的文件复制到路径 Anaconda3 DLLs 下
  • win10系统下TwinCAT3与VS2019之间的ADS通信

    64 WIN10 TwinCAT3 VS2019 ADS 转博后第一次出差 xff0c 来到了UnitedImaging xff0c 这次的任务是负责在ros系统和TwinCAT3之间的 ADS 通信 作为本次第一篇博客 xff0c 先跑通
  • 两步实现安卓手机秒变网络摄像头

    今天大概是兴趣加技术篇 xff0c 程序员不写点有趣的代码 xff0c 怕是很难在女票和家人面前秀出科技感 GITHUB xff1a https github com AndroidMsky RootPlay 如GIF所示 xff0c 自动
  • TwinCAT3与ROS之间的ADS通信实现

    TwinCAT3与ROS之间的ADS通信实现方法 摘要 xff1a TwinCAT xff08 The Windows Control and Automation Technology xff0c 基于Windows的控制和自动化技术 x
  • 基于DDPG、TD3的UR5装配仿真及其对比

    本项目为上海交通大学2020年度秋季学期 xff0c 乐心怡老师讲授的 最优控制 课程的大作业 xff0c 大部分内容基于方晓猛学长的工作 基于神经网络算法的多机械臂协同控制技术研究 xff0c 最近因为开题所以重新温习了一下强化学习 xf
  • Bullet 布料仿真的底层算法分析

    Bullet 可变物体的底层算法分析 1 计算机图形学中可变建模方法1 1 质点 弹簧模型 xff08 离散 xff09 1 2 有限元连续体模型 xff08 连续 xff09 2 布料模拟的两种主要算法2 1 隐式时间积分2 2 基于位置
  • 【文献阅读】Position Based Dynamics

    文献阅读 Position Based Dynamics 摘要3 Position Based Simulation3 1 算法3 2 求解器3 3 约束投影3 4 碰撞检测和回应3 5 阻尼3 6 接触 4 布料仿真4 1 布料的表示4
  • 完成一篇机器人领域期刊论文所需要的一些工具

    完成一篇机器人领域期刊论文所需要的一些工具 书写工具制图工具PDF格式PPT制图VISIO制图 EPS 格式Inkspace 仿真工具MATLAB路径点生成实时仿真动画Gif生成 ROS 仿真Rviz仿真 剪辑工具录屏软件 Obs Stud
  • NSData转为Int

    在Socket传输中 收到的数据一般都是NSData型 但是我们要对数据进行分析 分解出长度等信息 然后转为Int型 这里就需要转换 swift代码如下 var len Int data getBytes amp len length si
  • 常用的RTMP、RTSP、HTTP协议流直播流地址

    一 RTMP RTSP HTTP协议 这三个协议都属于互联网 TCP IP 五层体系结构中应用层的协议 理论上这三种都可以用来做视频直播或点播 但通常来说 xff0c 直播一般用 RTMP RTSP 而点播用 HTTP 下面分别介绍下三者的
  • 不同工程同一套代码(基础组件SDK一样)的使用

    说明 xff1a 当使用公司的代码要适应不同的地域的需求 xff0c 需要在基础组件的基础上开发不同的App即不同的工程 xff08 请看下图 xff09 xff0c 当两个工程用到同一套代码如何做到互不影响 xff0c 请看下文代码 1
  • 字节序、比特序(一)

    1 字节序 字节序即字节的存储顺序 xff0c 如果数据都是单字节的 xff0c 那怎么存储无所谓了 xff0c 但是对于多字节数据 xff0c 比如int xff0c double等 xff0c 就要考虑存储的顺序了 字节序是硬件层面的东
  • win10下,VsCode搭建golang运行环境,并能断点调试

    第一步 xff0c 下载 基础包 vscode git go xff0c 我用的都是64位 1 vscode https code visualstudio com Download 2 git https git scm com down
  • 揭秘之从RecyclerView滑动监听到Gilde平滑加载图片

    未经允许不得转载 转载请注明作者AndroidMsky及原文链接 http blog csdn net androidmsky article details 53115818 本文应该是RecyclerView的第三篇 xff0c 今天来
  • Unity 动画状态机 设置Trigger后,有时触发动画有时触发不了的问题

    如果想立即触发下一个动画 xff0c 必须把 has exit time 去掉 否则会有时能触发 xff0c 有时触发不了

随机推荐

  • [海康威视]-超脑设备告警布防代码C#实现

    这是海康威视的超脑设备的 告警布防 程序 xff0c 可以控制 接收超脑的识别到的熟人和陌生人的告警信息 通过超脑里面的人脸数据和摄像机抓拍到的人进行比对 xff0c 如果是人脸库的的人就返回 给你告警布防程序信息 xff0c 包括姓名 x
  • [海康威视]-门禁设备告警布防代码C#实现

    这是海康威视的门禁的 告警布防 程序 xff0c 人脸识别 xff0c 身份证识别 xff0c 可以控制 门禁的开关 可以接收门禁刷身份证的相关身份证信息 识图拿代码
  • centOS 7安装 teamviewer 再启动系统就登录不了系统了

    centOS7 安装了teamviewer 12 0 93330 i686 rpm 和teamviewer 13 0 9865 i686 rpm 都出现了同类情况 安装能成功 xff0c 安装命令直接 用的 yum install 安装后
  • Unity 按钮的按下处理事件之自定义处理函数

    例如 qq登陆按钮 首先准备好按钮 xff0c 然后按照下面的步骤 xff1a 1 给按钮添加脚本文件login btn qq cs 其实我已经添加好了 只是演示在哪里添加 2 打开 login btn qq cs 文件 xff0c 添加
  • vs2017安卓开发的问题:模拟器报错 Decryption unsuccessful

    按照微软官方文档还算顺利 直到 这里 Docs Xamarin Xamarin Android 开始操作 了解 Android 第 1 部分 xff1a 快速入门 这里zhi 39 直到写完代码也很顺利 但是调用模拟器时报错了 原因是 xf
  • 《视觉SLAM十四讲》 编译报错问题汇总 Ubuntu20.04

    Ubuntu 20虚拟机环境安装 高翔原视频是ubuntu14 04 xff0c 看了一下 xff0c 有很多库都有兼容问题 xff0c 所以初步按这个Ubuntu 20装 xff1a 这个教程是ubuntu20的 用ubuntu14会不兼
  • C语言结构体(struct)常见使用方法

    目录 结构体声明与定义 结构体变量及其内部成员变量的定义及访问 引用 xff08 C 43 43 xff09 指针和数组 结构体嵌套 结构体与函数传参 占用内存空间 变长结构体 基本定义 xff1a 结构体 xff0c 通俗讲就像是打包封装
  • 如何禁止STL map 自动排序

    最近在做一个SPC SQC 的项目 其中有一处用到了stl map 得到了一个小小的心得 xff0c 分享给大家 我们知道 xff0c 在向map中插入数据对时候 xff0c map中的元素将按照一定的顺序被插入到对应的节点上 xff0c
  • 关于buffer overflow detected 程序崩溃的思考

    我是在使用别人源码 xff08 DBT2 benchmark xff09 的时候 xff0c 编译成功然后运行就出现了这个问题 本以为像这种开源的软件应该没什么太明显的bug xff0c 但是后来细想 xff0c buffer overfl
  • 安卓微信自动抢红包插件优化和实现

    转载请注明作者AndroidMSky和链接http blog csdn net AndroidMsky article details 53490459 又是兴趣系列 网上有很多自动强红包的例子和代码 xff0c 笔者也是做了一些优化 先说
  • 串口通信的基本知识

    串口通信的基本知识 前些天发现了一个巨牛的人工智能学习网站 xff0c 通俗易懂 xff0c 风趣幽默 xff0c 分享一下给大家 点击跳转到教程 本文介绍了串口通讯的基本概念 数据格式 通讯方式 典型的串口通讯标准等内容 串口通讯 xff
  • 【毕业设计】深度学习YOLO图像视频足球和人体检测 - python opencv

    1 前言 x1f6a9 深度学习YOLO图像视频足球和人体检测 x1f947 学长这里给一个题目综合评分 每项满分5分 难度系数 xff1a 3分工作量 xff1a 3分创新点 xff1a 5分 x1f9ff 选题指导 项目分享 xff1a
  • 【C语言编程入门系列】—— 第三章,编写第一个C语言程序!

    导读 xff1a 一般学一门计算机语言的第一堂上机课 xff08 上机 顾名思义 xff0c 上计算机 xff0c 机你太美 xff09 xff0c 就是往屏幕输出 hello world xff0c 本章也不例外 3 1 Hello Wo
  • 基于PCNTL的PHP并发编程

    原创文章 xff0c 转载请注明出处 xff1a http huyanping sinaapp com p 61 178 作者 xff1a Jenner PHP是一门较早出现的WEB开发脚本语言 xff0c 并由于其语法结构简单 易学 开源
  • 基于Redis的MessageQueue队列封装

    原创文章 xff0c 转载请注明出处 xff1a http www huyanping cn p 61 275 作者 xff1a Jenner Redis的链表List可以用来做链表 xff0c 高并发的特性非常适合做分布式的并行消息传递
  • 基于PHP的crontab定时任务管理

    BY JENNER 2014年11月10日 阅读次数 xff1a 6 linux的crontab一直是服务器运维 业务开展的利器 但当定时任务增多时 xff0c 管理和迁移都变得很麻烦 xff0c 而且容易出问题 下面提供了一个使用php编
  • PHP模拟SQL的GROUP BY算法

    BY JENNER 2015年1月24日 阅读次数 xff1a 25 github地址 xff1a https github com huyanping Zebra PHP ArrayGroupBy packagist地址 xff1a ht
  • flume:支持重命名、移动文件的roll file sink升级版

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 flume xff1a 支持重命名 移动文件的roll file sink升级版 转载请注明 xff1a 始终不够 flume xff1a 支持重命名 移动文件的r
  • wordpress全栈优化

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 wordpress全栈优化 转载请注明 xff1a 始终不够 wordpress全栈优化 从最开始计算 xff0c 始终不够 个人博客上线已经有两年多了 从最开始就
  • 递归与循环

    原创文章 xff0c 转载请注明 xff1a 转载自始终不够 本文链接地址 递归与循环 转载请注明 xff1a 始终不够 递归与循环 大一学C 43 43 的时候 xff0c 老师说过递归与循环是可以相互转化的 xff0c 当时好像是用来两