好顺佳集团
2023-02-17 09:02:44
2419
内容摘要:递归是程序调用自身的编程技巧。递归作为一种算法在编程语言中被广泛应用。 过程或函数可以在其定义或说明中直接或间...
递归是程序调用自身的编程技巧。
递归作为一种算法在编程语言中被广泛应用。 过程或函数可以在其定义或说明中直接或间接调用自身。 通常,将大而复杂的问题变换为与原问题相似的小规模问题进行求解。 递归策略可以用很少的程序描述求解问题过程所需的迭代计算,大大减少了程序的代码量。 递归的能力在于用有限的语句定义对象的无限集合。 通常,递归需要边界条件、递归前进段和递归返回段。 如果不满足边界条件,则递归前进; 当满足边界条件时,递归返回。
楼上洗洗睡吧,别逗了
递归是算法结构,回溯是算法思想
递归是在函数中调用函数本身来解决问题
回溯是指通过不同的尝试生成问题的解。 与网罗相似,但与网罗不同,回溯会进行“剪枝”。 这意味着,对于已经知道错误的结果,不需要列举以下答案。 例如,有序数列1、2、3、4、5会查找和为5的所有集合。 往前走后搜索选择1,选择2,然后选择3时发现比预想的还要多。 「
答案:是一定的。 但是,递归算法一定可以转换为非递归算法。 有些可以通过循环解决,而有些则不能通过复杂的递归解决。 一般通过堆栈解决。 从递归算法到非递归算法的转换3360递归算法和非递归算法的区别和转换递归算法实际上是一种分开解决的方法,是将复杂问题分解为简单问题进行求解的方法。 在哈尼奥塔问题等复杂问题中,递归算法是一种自然的、逻辑性的问题解决方法,但递归算法的执行效率通常很低。 因此在求解某个问题时,往往采用递归算法分析问题,采用非递归算法求解问题,而且一些编程语言不支持递归,因此有必要将递归算法转换为非递归算法。 有两种方法可以将递归算法转换为非递归算法。 一种是直接评价的方法,不需要回溯;另一种是不能直接评价,需要回溯。 前者使用称为直接变换法的几个变量保存中间结果;后者使用堆栈保存中间结果称为间接变换法,以下分别讨论这两种方法。 1 .直接变换法直接变换法通常用于消除尾部递归和单向递归,用循环结构代替递归结构。 尾部递归是递归算法中只有一个递归调用语句,并且位于算法的末尾。 例如求阶乘的递归算法: longfact(intn ) if ) n==0) return 1; Elsereturnn*fact(n-1; }递归调用返回时,将返回上一层递归调用的下一条语句。 这个返回位置正好是算法的最后,所以不需要在堆栈上保存返回信息。 对于尾部递归形式的递归算法,可以利用循环结构代替。 例如,求阶乘的递归算法可以是长fact (intn ) { int s=0; for(intI=1; i=n; I ) s=s*i; //用s保存中间结果返回s; }单向递归是指递归算法中有多个递归调用语句,但各递归调用语句的参数之间没有关系,递归调用语句位于递归算法的末尾。 显然,尾部递归是单向递归的特例。 例如,求解斐波那契数列的递归算法如下: intf(intn ) if(n==1||n==0)返回1; Elsereturnf(n-1 ) f ) n-2; }单向递归时,可以设置几个变量来保存中间结构,并用循环结构替换递归结构。 例如,在求斐波那契数列的算法中,用s1和s2保存中间的计算结果。 非递归函数如下所示: intf(intn ) ) { int i,s; int s1=1,s2=1; for(I=3; i=n; I () { s=s1 s2; s2=s1; //保存F(N-2 )的值s1=s; //f (保存n-1 )的值) } return s; }2.间接变换法该方法采用栈存储中间结果,一般来自递归函数运行过程中栈的变化。 典型过程返回初始状态s0到堆栈while (堆栈不为空),并向s分配堆栈顶部元素; 返回if(s是正在寻找的结果); 已发现有关else {的状态s1; s1栈} }间接变换法在数据结构上有很多例子,如二叉树遍历算法的非递归实现、图的深度优先遍历算法的非递归实现等。 用非递归方法实现递归问题的算法程序不仅可以节省存储空间,而且可以大大提高算法程序的执行效率。 本文将递归问题分为简单递归问题和复杂递归问题简单递归问题的非递归实现采用递归技术求解,而复杂递归问题根据问题解决的特点采用两种非递归实现算法,采用堆栈实现。
《计算机技术与发展》 - 2011 -维普
《计算机技术与发展》昂扬.基于NET平台的三层架构软件框架的设计与实现[J] .计算机技术与发展,2011,21 (2) 336077-80,85 .昂扬,高扬.
递归是函数在该函数内调用其本身。 执行递归函数时,它本身会被反复调用,每次调用时进入一个新的级别。 递归函数需要结束条件。
当函数递归持续到遇到墙并返回时,此墙是终止条件。
所以递归需要两个因素,结束条件和递归关系。
递归有两个基本要素。
(1)边界条件)确定递归何时结束。 也称为递归出口。
)递归模式:大问题如何分解成小问题? 也称为递归体。 递归函数只有具备这两个要素,才能在有限次计算后得出结果
在递归函数中,被调用函数和被调用的函数是同一函数。 应该注意的是递归函数的调用层次。 将调用递归函数的主函数称为层0,进入函数后才进行递归调用本身称为层1调用。 从层I递归调用本身称为层i 1。 相反,要结束第i 1层呼叫,必须返回到第I层。
一个递归函数的调用过程类似于多个函数的嵌套调用,但调用函数和被调用函数是同一个函数。 为了保证递归函数的正确执行,系统需要设置工作栈。 具体来说,递归调用的内部执行过程如下。
)运动开始时,首先构建递归调用的工作栈,其结构包括值参、局部变量和返回地址;
)2)每次执行递归调用时,将递归函数值代入局部变量的当前值以及调用后的返回地址;
)3)每次递归调用结束时,将堆栈顶部
扩展数据:
递归是一个函数直接或间接调用了自身,这种调用方法称为递归调用。 说白了,还是函数调用。 既然是函数调用,那么原则是所有被调用的函数都要制作副本,每个都要为调用方提供服务,而不受其他函数的影响。
你的ff函数递归几次才能复制多少个? 另外,利用内存的堆栈管理,相反退出。 这个你最好找一下“堆栈”这方面的东西。 很简单。 就像弹坑一样,先进去出来。
从某种意义上说,这是错误的。 正如我刚才说的,一旦被调用,他会把代码复制到内存中,一旦被调用又复制。 换句话说,同一函数的多次调用可以理解为多个不同函数的一次调用。 那样的话,会变得简单。
另外=1和=0为什么退出? 递归,需要注意的是死递归。 也就是说,进入某个函数无限调用自身的情况,永远消耗内存等资源,在编程方面是一大禁忌。
但是,递归函数一定会在某个地方有返回上一级函数的代码。 否则,一定是递归的。 在ff函数中,else是返回的出口。 请考虑一下,如果没有那个if进行判断的话,递归计算到什么时候才能结束? ff不是一直呼唤自己吗?
因为在某个函数a中调用函数b (或者自己)时,a中的代码会在调用的位置停止,然后移动到b中执行。 同样,当b再次调用函数c时,b又在调用的位置停止,执行c。 如果被无限调用,程序永远不会结束。
当然,a调用b,不管b的死活都继续自己的代码,有时也不在我们的讨论范围之内。 那是因为它牵扯到了另一种叫做多线程的编程。
参考资料:
张总监 13826528954
限时领取创业礼包
所有服务
您的申请我们已经收到!
专属顾问会尽快与您联系,请保持电话畅通!