×

递归算法设计的关键是提取求解问题的

递归算法设计的关键是提取求解问题的(递归算法的设计关键是什么)

admin admin 发表于2024-09-06 23:14:40 浏览7 评论0

抢沙发发表评论

“递归算法设计的关键是提取求解问题的”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看递归算法设计的关键是提取求解问题的(递归算法的设计关键是什么)!

本文目录

递归算法的设计关键是什么

  • 终止条件! 不然就崩了 还有就是 不能太深递归(数百次)

  • 是结束条件和每次需要计算的过程

递归算法还不是很理解!!高手教一教!

递归(recursion)是指把一个大的问题转化为同样形式但小一些的问题加以解决的方法。C语言允许一个函数调用它本身,这就是递归调用。即在调用一个函数的过程中又直接或间接地调用函数本身。不加控制的递归都是无终止的自身调用,程序中是绝对不应该出现这种情况的。为了防止无休止的递归,程序中应控制递归的次数,在某条件成立时进行递归,条件不成立不进行递归调用。并且在递归的调用过程中,不断改变递归的条件,以使递归条件不再成立。 同一问题可能既可以用递归算法解决,也可以用非递归算法解决,递归往往算法设计简单,出奇制胜,而普通算法(通常用循环解决)往往设计稍复杂。但执行效率递归算法逊于循环算法。递归反复调用自己,需要占用较多内存和计算机时间。但有一些问题只有用递归方法才能解决,如著名的汉诺塔问题。 递归程序设计的关键就是考虑问题的两种情况,一种是普遍情况即函数值等于把问题递推一步后的本函数的调用,一种是极端或端点情况,此时函数值有确定的一个值而无须再调用本函数。递归的过程就是从普遍情况逐步过渡到端点情况的过程。例子: 5个坐在一起论年龄,问第五个人多少岁?他说比第四个人大两岁。问第四个人多少岁,他说比第三个人大两岁。问第三个人多少岁,他说比第二个人大两岁。问第二个人多少岁,他说比第一个人大两岁。问第一个人多少岁,他说10岁。请问第五个人几岁?int age(int n) { int x; if(n》1) x=age(n-1)+2; else if(n==1) x=10; return x;} void main( ) { printf("%d",age(5));}

什么情况下可以利用递归来解决问题再写递归程序时应注意是什么

比如阶乘,也就是说求n可以先求n-1,以此类推,到1,这类问题都可以用递归解决,菲波拉锲数也可以递归。因为递归是总是调用自身解决问题,所以,必须有结束条件,否则会出问题,导致内存卡爆

什么是“递归”“递归”有什么用

1、程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。\x0d\x0a\x0d\x0a2、递归一般的作用用于解决三类问题:\x0d\x0a(1)数据的定义是按递归定义的。(Fibonacci函数)\x0d\x0a(2)问题解法按递归算法实现。\x0d\x0a这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。\x0d\x0a(3)数据的结构形式是按递归定义的。

适合用递归算法求解的问题的充分必要条件是什么

先来理解下概念:递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。充分必要条件是:问题具有某种可借用的类同自身的子问题描述的性质;某一有限步的子问题(也称本原问题)有直接的解存在。注意:递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。可以自己写几个就知道了

请教高人 递归算法编写思路技巧

一个子程序(过程或函数)的定义中又直接或间接地调用该子程序本身,称为递归。递归是一种非常有用的程序设计方法。用递归算法编写的程序结构清晰,具有很好的可读性。递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。利用递归算法解题,首先要对问题的以下三个方面进行分析:一、决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。二、问题的边界条件及边界值。在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。三、解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。把这些步骤或等式确定下来。把以上三个方面分析好之后,就可以在子程序中定义递归调用。其一般格式为:if 边界条件 1 成立 then赋予边界值 1【 elseif 边界条件 2 成立 then赋予边界值 2┇ 】else调用解决问题的通式endif例 1 : 计算勒让德多项式的值x 、 n 由键盘输入。分析: 当 n = 0 或 n = 1 时,多项式的值都可以直接求出来,只是当 n > 1 时,才使问题变得复杂,决定问题复杂程度的参数是 n 。根据题目提供的已知条件,我们也很容易发现,问题的边界条件及边界值有两个,分别是:当 n = 0 时 P n (x) = 1 和当 n = 1 时 P n (x) = x 。解决问题的通式是:P n (x) = ((2n - 1)P n - 1 (x) - (n - 1)P n - 2 (x)) / n 。接下来按照上面介绍的一般格式定义递归子程序。function Pnx(n as integer)if n = 0 thenPnx = 1elseif n = 1 thenPnx = xelsePnx = ((2*n - 1)*Pnx(n - 1) - (n - 1)*Pnx(n - 2)) / nendifend function例 2 : Hanoi 塔问题:传说印度教的主神梵天创造世界时,在印度北部佛教圣地贝拿勒斯圣庙里,安放了一块黄铜板,板上插着三根宝石针,在其中一根宝石针上,自下而上地放着由大到小的 64 个金盘。这就是所谓的梵塔( Hanoi ),如图。梵天要求僧侣们坚持不渝地按下面的规则把 64 个盘子移到另一根针上:(1) 一次只能移一个盘子;(2) 盘子只许在三根针上存放;(3) 永远不许大盘压小盘。梵天宣称,当把他创造世界之时所安放的 64 个盘子全部移到另一根针上时,世界将在一声霹雳声中毁灭。那时,他的虔诚的信徒都可以升天。要求设计一个程序输出盘子的移动过程。分析: 为了使问题更具有普遍性,设共有 n 个金盘,并且将金盘由小到大依次编号为 1 , 2 ,…, n 。要把放在 s(source) 针上的 n 个金盘移到目的针 o(objective) 上,当只有一个金盘,即 n = 1 时,问题是比较简单的,只要将编号为 1 的金盘从 s 针上直接移至 o 针上即可。可定义过程 move(s,1,o) 来实现。只是当 n》1 时,才使问题变得复杂。决定问题规模的参数是金盘的个数 n ;问题的边界条件及边界值是:当 n = 1 时, move(s,1,o) 。当金盘不止一个时,可以把最上面的 n - 1 个金盘看作一个整体。这样 n 个金盘就分成了两个部分:上面 n - 1 个金盘和最下面的编号为 n 的金盘。移动金盘的问题就可以分成下面三个子问题(三个步骤):(1) 借助 o 针,将 n - 1 个金盘(依照上述法则)从 s 针移至 i(indirect) 针上;(2) 将编号为 n 的金盘直接从 s 针移至 o 针上;(3) 借助 s 针,将 i 针上的 n - 1 个金盘(依照上述法则)移至 o 针上。如图其中第二步只移动一个金盘,很容易解决。第一、第三步虽然不能直接解决,但我们已经把移动 n 个金盘的问题变成了移动 n - 1 个金盘的问题,问题的规模变小了。如果再把第一、第三步分别分成类似的三个子问题,移动 n - 1 个金盘的问题还可以变成移动 n - 2 个金盘的问题,同样可变成移动 n - 3 ,…, 1 个金盘的问题,从而将整个问题加以解决。这三个步骤就是解决问题的通式,可以以过程的形式把它们定义下来:hanoi(n - 1,s,o,i)move(s,n,o)hanoi(n - 1,i,s,o)参考程序如下:declare sub hanoi(n,s,i,o)declare sub move(s,n,o)input "How many disks?",ns = 1i = 2o = 3call hanoi(n,s,i,o)endsub hanoi(n,s,i,o)rem 递归子程序if n = 1 thencall move(s,1,o)elsecall hanoi(n - 1,s,o,i)call move(s,n,o)call hanoi(n - 1,i,s,o)endifend subsub move(s,n,o)print "move disk";n;print "from";s;"to";oend sub

什么是递推法和递归法两者在思想上有何联系

1、递推法:递推算法是一种根据递推关系进行问题求解的方法。通过已知条件,利用特定的递推关系可以得出中间推论,直至得到问题的最终结果。递推算法分为顺推法和逆推法两种。 

2、递归法:在计算机编程中,一个函数在定义或说明中直接或间接调用自身的编程技巧称为递归。通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归做为一种算法在程序设计语言中广泛应用。 

3、两者的联系:在问题求解思想上,递推是从已知条件出发,一步步的递推出未知项,直到问题的解。从思想上讲,递归也是递推的一种,只不过它是对待解问题的递推,直到把一个复杂的问题递推为简单的易解问题。然后再一步步的返回去,从而得到原问题的解。 

扩展资料

相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。

比如阶乘函数:f(n)=n*f(n-1)   

在f(3)的运算过程中,递归的数据流动过程如下:   f(3){f(i)=f(i-1)*i}--》f(2)--》f(1)--》f(0){f(0)=1}--》f(1)--》f(2)--f(3){f(3)=6}  

而递推如下:   f(0)--》f(1)--》f(2)--》f(3)   由此可见,递推的效率要高一些,在可能的情况下应尽量使用递推。

但是递归作为比较基础的算法,它的作用不能忽视。所以,在把握这两种算法的时候应该特别注意。

如果你还想了解更多这方面的信息,记得收藏关注本站。