递归转非递归理解

递归理解二:二叉树遍历、双递归转非递归 根据函数表述:两个递归函数是将数组的左半部分和右半部分不断分解,直到left>=right(注意终止条件不画出),得到如下二叉树。后,进行实践的规律总结,以下面二叉树遍历为例,相关代码会在文章后面贴出。在上述例子中,我们把merge函数盖住,将。的口诀及应用,拓展至递归函数中,相对于用。二叉树遍历分为:深度遍历和层级遍历。即上述层序遍历的代码的执行结果同上。注意:array的下标是从0开始的。那么我们应该怎样用这个规律,去。即,前序遍历代码输出结果同上。得到该执行语句的入参。 阅读详情

可以使用下面这几种方法来实现递归到非递归的转换.

(1) 循环方法
循环方法是所有递归到非递归的转换中最理想的方法,可以将开销减少到最小.
不过也是分析起来最复杂的,对于简单的递归可以用这样的方法来处理.
例如:Factorial计算
这里回到n!(阶乘)定义上面来分析,这里将n!数学意思为n! = n*(n-1)! & 1!=1;做一个扩展可以到到n!另外一个表示方法n! = n*(n-1)*(n-2)*....*1;
这样就可以很容易得到另外一个定义:
n!表示执行n次循环计算一个增量k,初始k=1和结果t=1;每次t乘以k++的值.
ISO C++实现代码如下:

Factorial(int n){
   int k = 1 ;//增量
   int t = 1 ;//临时结果
   while(k!=n){
      t*=k;
      k++;
   }
   return t;
}



这样可以避免递归带来的大量堆栈操作.

(2) 自定义堆栈
对于复杂逻辑的堆栈操作,需要借助外部堆栈来实现.
因为对于所有的递归操作最后分析出来都是形成的一颗树形结构.
下面是一个递归实现Factorial的一个方法,虽然在这个程序中对比循环来相对复杂,不过对于一些不能分析出来循环的递归操作来说自定义堆栈的方法可以达到空间开销可控.

Factorial(int n){
   Stack s;
   int t = 1;//临时变量
   s.push(n);
   while(s.top()!=1)[
      t *= s.top();
      s.push(s.top()-1);
      s.pop();
   }
   return t;
}

除了上面这两种方法外,还可以使用一种迭代的方法实现递归到非递归的处理.




C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历) 二叉树的非递归遍历C/C++实现: 非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历 struct tree* temp = root; while (temp != NULL || S.top > 0) { while (temp != NULL) { ... 阅读详情

相关推荐

关于递归函数转换为非递归函数的一些方式

关于递归函数转换非递归函数的一些方式前言目的可行性转换的几种途径 前言 最近在重拾算法和数据结构的一些知识,打算从基本的树的遍历算法入手。网上翻看了很多的二叉树的遍历算法相关文章,二叉树的遍历有前、中、后三种遍历方法。最简单的用递归方法遍历,三种方法的逻辑一目了然很好理解,看到非递归遍历方法时,前序遍历还能理解,中序和后序遍历看的理解起来感觉不那么顺了,所以想先研究一下递归方法改非递归方法的一些方...

weixin_41572011的博客 3657

递归如何转换为非递归

递归算法实际上是一种分而治之的方法,它把复杂问题分解为简单问题来求解。递归的特点包括:递归过程简洁、易编、易懂;递归过程效率低、重复计算多。考虑递归的执行效率低,可以尝试将递归过程转换为非递归过程。本文就是来探讨怎么转换的。将递归算法转换为非递归算法有两种方法,一种是直接求值(迭代/循环),不需要回溯;另一种是不能直接求值,需要回溯。前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间结

Veaxen的博客 2401

每天刷个算法题20160523:骑士巡游的递归转非递归解法

为了防止思维僵化,每天刷个算法题。这里是骑士巡游的递归转非递归解法。

小飞的技术博客 5118

递归和非递归

1、递归就是函数调用函数本身,运行起来就是函数嵌套函数,层层嵌套,所以函数调用、参数堆栈都是不小的开销,但是程序简单。 2、非递归就是不断地对参数入栈、出栈,省去了函数层层展开、层层调用的开销。虽然参数出入栈次数多了,但是一般都开辟固定的足够大的内存来一次性开辟、重复使用。 3、非递归是从堆栈的角度来编写程序,速度快,但代码复杂。 递归是从问题本身的逻辑角度来编写,虽然速度相对慢,但代码容易理解。...

RuanMeng的博客 1万+

每天刷个算法题20160524:阿克曼函数的递归转非递归解法

为了防止思维僵化,每天刷个算法题。这里是阿克曼函数的递归转非递归解法。

小飞的技术博客 8575

递归算法转为非递归算法

递归算法转为非递归算法。方法、过程,用栈的原理

递归算法转化为非递归算法

(1)直接用循环结构的算法替代递归算法(直接转化法,不需要使用栈) (2)用栈模拟系统的运行过程,通过分析只保存必须保存的信息,从而用非递归方法替代递归算法。(间接转化法,需要使用栈) 用循环结构替代递归过程: 采用循环结构消除递归这种直接转化法没有通用的转换算法,对于具体问题要深入分析对应的递归结构,设计有效的循环语句进行递归到非递归的转换。 直接转化法特别适合于尾递归。尾递归只有一个递归调用语...

SYGODNICE的博客 8273

别再踩坑了!手把手教你用EB Tresos Studio创建Autosar MCAL工程(含模块配置避坑指南)

本文详细介绍了使用EB Tresos Studio创建Autosar MCAL工程的完整流程,包括工程创建前的关键准备、模块配置的避坑指南以及工程验证与代码生成的实用技巧。通过实战案例和黄金准则,帮助开发者高效完成MCAL工程创建,避免常见错误,提升开发效率。

weixin_42536058的博客 444

对递归和非递归的理解

虽然里面是用c++作为例子的,但是编程的思想:算法是通用的。就像这位老兄说的一样,俗话说:黑猫白猫,能抓到老鼠的猫最好。我们计算机编程算法设计虽然不能仅仅要求解决问题,还涉及到起码要有一个就算不能是最优也要比较优化的算法。而有时候人的思维是有局限的,我认为,所谓的算法类型也只不过是人们在编程后总结出来大量算法的共性,形成的不同类型的算法,我们大可不必为了算法而运用算法,反而使我们被人为总结的算法而

gwpJava的专栏 1337

DPABI安装教程

DPABI是是中科院心理研究所严超赣老师团队开发的一款磁共振脑影像数据分析工具包。基于SPM,在安装DPABI之前需要安装好SPM,才能正常使用。SPM的安装方法见文matlab2021a版本条件下安装spm_kidllll的博客-优快云博客 1、下载安装包 下载地址:DPABI: a toolbox for Data Processing & Analysis for Brain Imaging | The R-fMRI Network 2、将下载好的dpabi文件夹移动到matl..

qq_42356925的博客 1万+

手把手教你配置RK3588的FFmpeg+RKmpp:从解码到RGA转换的完整避坑指南

本文详细介绍了在RK3588平台上配置FFmpeg+RKmpp进行硬件解码和RGA图像处理的完整流程,包括环境准备、DRM Prime解码输出实战、RGA硬件加速转换技巧以及全链路性能调优。通过具体代码示例和问题排查指南,帮助开发者高效实现视频处理流水线,显著提升性能并降低CPU占用率。

weixin_28366475的博客 473

递归算法到非递归算法的转换

递归实质在定义自身的同时又出现了对自身的调用。递归算法是许多软件编程人员常用的方法,结构简单、清晰、可读性好。但在实际应用中也存在一些问题:1.并不是每一门语言都支持递归,比较典型的FORTRAN语言,它明确规定了不允许直接或间接使用递归;2.递归算法在执行过程中会消耗太多的时间和空间。而在实际设计程序过程中,递归程序比非递归程序要容易设计,因此在许多情况下,常常是先设计出递归程序,然后...

dianwei0041的博客 1134

MTK眼中6G物理层与无线协议的进化之路

提议统一波束和小区级的测量、报告和切换框架/流程,进一步减少移动性切换过程中的中断,采用可扩展框架/流程,允许在不同移动性场景中进行部分用户设备配置更新以实现快速切换,支持用户设备发起的移动性(同步/切换)以降低延迟和因信令交换导致的失败,设计移动性RS以实现空闲状态下的节能和连接状态下的无缝用户体验,实现5G/6G间的无缝互操作移动性,为固定无线接入(FWA)提供潜在增强,构建统一的跨层移动性框架以降低复杂度、减少中断和失败。为适应多样化的流量类型,需要灵活的帧结构和高层时间对齐。

asd199086的博客 1745

【编程学习记录】递归转非递归

想要知道怎么递归转非递归,就得先弄明白递归函数调用和返回的步骤(来源于网课): 调用 保存调用信息(参数,返回地址) 分配数据区(局部变量) 控制转移给被调函数的入口 返回 保存返回信息 释放数据区 控制转移到上级函数 因为递归满足LIFO,所以用栈来实现 递归转非递归方法 最机械的转换方法: 设置t+2个语句标号,t为函数递归调用的次数,令第0个标号为递归入口,1到t标记各个...

weixin_38623697的博客 654

python爬取淘宝数据

python爬取淘宝数据淘宝评论 淘宝评论 打开淘宝,选择打开需要爬取的商品的评论。在谷歌浏览器选择开发者工具,选择network,找到list_detail_rate.htm?itemId=624466733121,点击headers、previews,可以看见相应的评论数据。 爬取一页屏评论代码如下 import re import requests headers = { 'Referer': '在headers中', 'User-Agent': '在

qq_36333776的博客 5797

solidworks实体显示线框

solidworks实体莫名其妙显示为有点虚的线框

qq_35858902的博客 1万+

后序非递归遍历

  对树进行后序非递归遍历一般会借助栈来保存路径上的节点。   后序非递归遍历的一个特点就是:当访问到一个节点时,栈中所保存的节点正好是这个节点的所有祖先节点,因此后续非递归遍历可用来解决以下问题: 当给定一个节点时,输出该节点的所有祖先 输出根结点到叶子节点的所有路径 求每条路径上的节点值之和   后序非递归遍历的关键点在于判断遍历过程中什么时候该往右走,什么时候该访问节点内容。   我们使用一个栈来保存遍历路径上的节点,步骤如下: 一直往左孩子遍历,遍历过程中保存遍历的节点 当左孩子为空时,我们访

yleave的博客 5152

Zynq 【SDK裸机开发之PS】——DDR的内存分配使用详解

Zynq如果跑操作系统的话,内存管理的工作都会交给系统来操作,但是如果是裸机的话,则需要自己对DDR3的内存进行管理。

shizhibuyi1234的博客 7376

二叉树非递归遍历

非递归方式实现先序遍历 具体过程: 1.首先申请一个新的栈,记为stack。 2.然后将头节点head压入stack中。 3.每次从stack中弹出栈顶节点,记为cur,然后打印cur节点的值,如果cur右孩子不为空的话,将cur的右孩子先压入stack中。最后,如果cur的左孩子不为空的话,将cur的左孩子压入stack中。 4.不断重复步骤三,直到stack为空,全部过程结...

ape79557的博客 144

还在用 RaiDrive/Rclone 挂载网盘?教您使用Windows 原生 WebDAV 丝滑直连 AList/Openlist,让你的网盘秒变本地硬盘!

网盘文件分散管理?😩 别再依赖第三方工具了!本文教你如何在 Windows 下,利用原生 WebDAV 功能,将 Openlist 网盘直接映射为本地硬盘!💻 操作简单,告别繁琐,让你的云端文件像本地文件一样丝滑!🚀 轻松实现高效管理,快来体验吧!

XiaoqiangClub的博客 2972

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

二叉树的非递归遍历

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 ​ 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。

qq_43169752的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

排序会了递归,不学非递归太可惜了

有一天我用水壶烧水的时候 不小心水放满了 于是当它烧沸腾的时候 水一直往外冒 我便想起了递归导致栈溢出的情况 于是阿紫姐姐便在网上学习了非递归算法 接下来阿紫姐姐传授给大家哦!

拼命阿紫冲冲冲! 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

递归转非递归几个实例

递归是程序设计中很重要的技巧,简单易于实现;但递归程序效率较之非递归低得多,递归函数要直接或间接的调用自身,系统栈要频繁操作,时间空间消耗很大。在要求高效的很多场合需要将递归程序改写成非递归程序,由于疏于梳理这方面的知识点,感觉对于有些递归结构有些力不从心,于是有意识的学习了一下,感觉好了很多。       关于递归程序转非递归程序,基本通用方法是用自定义栈结构模拟递归过程,这种方法就是万金油,

晓风残月xj 2264

二叉树的递归和非递归遍历

二叉树递归和非递归遍历

bubbleyang的博客 3214

递归转非递归的一些思考

(英语:Recursion),又译为,在与中,是指在的定义中使用函数自身的方法。递归一词还较常用于描述以方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。简而言之,在计算机中,递归就是指在一个函数中出现了自己调用自己的行为。上面的例子用来求解一个n的阶乘,在f函数中,出现了f自己调用自己的行为,因此f就是一个递归函数。

西城风雨楼 968
上一篇: 递归,回溯,DFS,BFS的理解和模板
下一篇: Convert Sorted Array to Binary Search Tree 把一个有序数组转换成BST @LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值