永发信息网

任何一个递归过程都可以转换成非递归过程

答案:2  悬赏:20  手机版
解决时间 2021-03-21 17:33
任何一个递归过程都可以转换成非递归过程
最佳答案
是的,说的没错
全部回答
首先要理解递归本身其实是一项非常重要的算法技巧。 递归满足两个条件: 1,不断调用函数本身,也就是递归函数。 2,调用是有限的,也就是递归出口。 为了理解方便,下面是用一个最简单的例子:求n的阶乘。 n!(阶乘)定义: n!数学意思为n! = n*(n-1)! & 1!=1; 其实根据上面递归定义结合分析下就可以n阶乘的递归算法: 1,构造一个递归函数,不断乘以自身和使用自身减一后调用同样函数. 2,定义出口,当函数参数等于1时结束; 如果用iso c++语言描述如下: int factorial(int n){ if( n > 1){ return n*factorial(n-1);//递归函数调用 } else if(n == 1){ return 1; //递归出口 } else{ return error;//报告输入错误 } } 这里讨论主要的不是上面这个简单的例子,而是下面的一些改良. 因为递归设计大量的堆栈操作,所以一般都会考虑将递归转为非递归来执行. 这里用上面这个程序作一个分析例子来分析. 假设这里执行factorial(4),那么程序会按照下面方式来执行: (1)执行factorial(4)判断n > 1执行factorial(3),并且将factorial(4)函数相关信息存入一个堆栈. (2)执行factorial(3)判断n > 1执行factorial(2),并且将factorial(3)函数相关信息存入一个堆栈. (3)执行factorial(2)判断n > 1执行factorial(1),并且将factorial(2)函数相关信息存入一个堆栈. (4)执行factorial(1)判断n == 1执行返回1; (5)将factorial(2)函数从堆栈中弹出,执行2*1,并且返回2. (6)将factorial(3)函数从堆栈中弹出,执行2*3,并且返回6. (7)将factorial(4)函数从堆栈中弹出,执行6*4,并且返回24. 如下图所示: factorial(4) -->factorial(3); -->factorial(2); -->factorail(1); <--factorail(1); <--factorial(2); <--factorial(3); <--结果 可以看到中间涉及的堆栈操作是很大的开销,每次需要保存当前函数的所有信息. 为了避免这样情况,可以使用下面这几种方法来实现递归到非递归的转换. (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; } 除了上面这两种方法外,还可以使用一种迭代的方法实现递归到非递归的处理.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
山东省青州第八中学地址在什么地方,我要处理
先化简再求值:-(x2+y2)+[-3xy-(x2-y2)]
我家宝贝2周岁半了,总是耳朵痒痒,是怎么回事
美菱净水器泰兴总经销在什么地方啊,我要过去
青城山前山到青城山火车站要多长时间
无限挑战和无限商社是怎么一回事呢。。。
向往的生活中13期黄磊28岁是什么歌
单选题1861年农奴制改革后,俄国资本主义经济
王者荣耀更新后金币没有了怎么回事 更新后金
怎么做咸肉,家里咸肉吃不完怎么样保存?
青岛味菜馆怎么去啊,有知道地址的么
土质边坡采用喷浆有什么缺点
GTA4和GTA5哪个最好玩?
买什么地段房子最保值,如果即将面临金融危机
联想E420开机后报警一声,停在startup interru
推荐资讯
冰雪在古诗词中的意象,各种各样的古诗词广告
拉菲狗狗价格具体点
梦见有个佛像对我说我是灵珠子转世~忘高人给
初中差生期末评语大全,优美的记叙文段450字
成语大全囵吞什么
张华在公汽上把坐位让给了老大爷,这句话有什
爸爸 妈妈和小姨子,三个人谁最胖
进口品质中国造 吉利博越2.0LMT怎么样
可以用手机将没绑的银行卡里的钱转到另一张卡
故事哪吒闹海,哪吒闹海,nezha,conquers,th
应该让孩子掌握哪些传统文化
梅头到温州客运中心的客车末班车几点
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?