
递归,简单说是子程序自己调用自己。
例子:
版本 2
子程序 左右查找
参数 左边值, 整数型
参数 右边值, 整数型
参数 查找数组, , 数组
参数 ww, , 参考 可空 数组
局部变量 i, 整数型
局部变量 j, 整数型
局部变量 中间值, 整数型
如果真 (左边值 ≥ 右边值)
返回 ()
如果真结束
i = 左边值
j = 右边值
判断循环首 (j ≠ i)
判断循环首 (查找数组 [左边值] ≤ 查找数组 [j] 且 i < j)
j = j - 1
判断循环尾 ()
判断循环首 (查找数组 [左边值] ≥ 查找数组 [i] 且 i < j)
i = i + 1
判断循环尾 ()
如果真 (i < j)
中间值 = 查找数组 [j]
查找数组 [j] = 查找数组 [i]
查找数组 [i] = 中间值
如果真结束
判断循环尾 ()
中间值 = 查找数组 [左边值]
查找数组 [左边值] = 查找数组 [i]
查找数组 [i] = 中间值
左右查找 (左边值, i - 1, 查找数组, ) ' 继续处理左边的,这里是个递归的过程
左右查找 (i + 1, 右边值, 查找数组, ) ' 继续处理右边的,这里是个递归的过程
ww = 查找数组
' 以上是快速排序的代码实现,核心所在是递归的过程。
递归(recursion)就是子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。
递归通常用来解决结构自相似的问题。所谓结构自相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小。实际上,递归是把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。因此,递归有两个基本要素:
(1)边界条件:确定递归到何时终止,也称为递归出口。
(2)递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果
汉诺塔问题:对汉诺塔问题的求解,可以通过以下3个步骤实现:
(1)将塔上的n-1个碟子借助塔C先移到塔B上;
(2)把塔A上剩下的一个碟子移到塔C上;
(3)将n-1个碟子从塔B借助塔A移到塔C上。
在递归函数中,调用函数和被调用函数是同一个函数,需要注意的是递归函数的调用层次,如果把调用递归函数的主函数称为第0层,进入函数后,首次递归调用自身称为第1层调用;从第i层递归调用自身称为第i+1层。反之,退出第i+1层调用应该返回第i层。采用图示方法描述递归函数的运行轨迹,从中可较直观地了解到各调用层次及其执行情况,具体方法如下:
(1)写出函数当前调用层执行的各语句,并用有向弧表示语句的执行次序;
(2)对函数的每个递归调用,写出对应的函数调用,从调用处画一条有向弧指向被调用函数入口,表示调用路线,从被调用函数末尾处画一条有向弧指向调用语句的下面,表示返回路线;
(3)在返回路线上标出本层调用所得的函数值。n=3时汉诺塔算法的运行轨迹如下图所示,有向弧上的数字表示递归调用和返回的执行顺序
三、递归函数的内部执行过程
一个递归函数的调用过程类似于多个函数的嵌套的调用,只不过调用函数和被调用函数是同一个函数。为了保证递归函数的正确执行,系统需设立一个工作栈。具体地说,递归调用的内部执行过程如下:
(1)运动开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址;
(2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址压栈;
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。
上述汉诺塔算法执行过程中,工作栈的变化如下图所示,其中栈元素的结构为(返回地址,n值,A值,B值,C值),返回地址对应算法中语句的行号,分图的序号对应图中递归调用和返回的序号
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来定义自己的方法,称为递归定义。形式如 f(n) = n f(n - 1), if n = 0, f(n) = 1
从问题的某一种可能出发,搜索从这种情况出发所能达到的所有可能,当这一条路走到“尽头”的时候,再倒回出发点,从另一个可能出发,继续搜索。这种不断“反悔”寻找解的方法,称作“回溯法”。
递归法好比是一个军队要通过一个迷宫,到了第一个分岔口,有 3 条路,将军命令 3 个小队分别去探哪条路能到出口,3 个小队沿着 3 条路分别前进,各自到达了路上的下一个分岔口,于是小队长再分派人手各自去探路——只要人手足够(对照而言,就是计算机的堆栈足够),最后必将有人找到出口,从这人开始只要层层上报直属领导,最后,将军将得到一条通路。所不同的是,计算机的递归法是把这个并行过程串行化了。
而回溯法则是一个人走迷宫的思维模拟,其实是一种试探,走错了倒回来,继续走。该方法放弃关于问题规模大小的限制,并将问题的方案按某种顺序逐一枚举和试验。发现当前方案不可能有解时,就选择下一个方案,倘若当前方案不满足问题的要求时,继续扩大当前方案的规模,并继续试探。如果当前方案满足所有要求时,该方案就是问题的一个解。 放弃当前方案,寻找下一方案的过程称为回溯。
递归算法依赖与前一步的结果,它的结果来源于一条主线,是确定的,而不是试探的结果,这就是其与回溯的区别,而在很多情况下,回溯与递归算法是在一起使用的。
递归会出现在子程序中自己调用自己或间接地自己调用自己。最直接的递归应用就是计算连续数的阶乘,计算规律:n! = (n - 1)! n。观察阶乘计算的规律,前一个数结成的结果可以直接被应用到后一个数结成的计算中。
回溯是一种算法思想,可以用递归实现。通俗点讲回溯就是一种试探,类似于穷举,但回溯有“剪枝”功能,比如求和问题。给定 7 个数字,1 2 3 4 5 6 7 求和等于 7 的组合,从小到大搜索,选择 1 + 2 + 3 + 4 = 10 > 7,已经超过了 7,之后的 5 6 7 就没必要在继续了,这就是一种搜索过程的优化。比如 8 皇后问题。
是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。
在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
汉诺塔问题,是常见可用递归解决的问题,不过也有非递归的解法。
菲波纳契数列可用递归定义。
以下为求汉诺塔问题的Pascal程序:
procedure Hanoi(n:integer;x,y,z:char);
递归
begin
if n<>1 then begin
Hanoi(n-1,x,z,y);
writeln(x,n,z);
Hanoi(n-1,y,x,z);
else writeln(x,n,z);
end;
end;
上述程序用接近自然语言的伪代码可表述如下:
Hanoi 过程 (整型参数n; 字符型参数 x,y,z);
//注:n 代表本步中要处理的盘子数,x,y,z 分别表示 n 号盘子原来所在柱子、经由柱子、目标柱子
开始
如果 n 不为 1 ,那么:开始
调用 Hanoi 过程 (参数为 n-1,x,z,y);
//注:这一步表示用本过程方法将剩余 n-1 个盘子从柱子 x 经由柱子 z 移动到柱子 y
输出 x,n,z; //注:表示将 n 号盘子从 x 移动到 z
调用 Hanoi 过程 (参数为 n-1,y,x,z);
//注:这一步表示用本过程方法将剩余 n-1 个盘子从柱子 y 经由柱子 x 移动到柱子 z
结束; //以上程序段就完成了把 n 个盘子从柱子 x 经由柱子 y 移动到柱子 z
否则 输出 x,n,z; //注:若 n 为1 的话本句直接输出表示将 n 号盘子从 x 移动到 z
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
函数嵌套调用过程示例
1 子问题须与原始问题为同样的事,且更为简单;
2 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
1、“递归”是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。
2、“迭代”的含义是:重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
以上就是关于易语言递归算法怎么用,求高手给举个简单点的例子全部的内容,包括:易语言递归算法怎么用,求高手给举个简单点的例子、c语言递归函数、递归与回溯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)