• 关于

    递归

    的搜索结果

回答

[递归]-分- [递推] 和 [回归] 递归的概念及递归算法的结构 1、所谓的递归,是指函数在执行过程中自己调用了自己或者说某种数据结构在定义时又引用了自身。这两种情况都可理解为递归。比如: void fun() { .. fun() .. }//fun 以上函数fun就是一个递归函数。而针对于各种数据结构中的递归结构就更多了,如单链表,广义表,树。在这些递归结构中,具有一个相同的特征:其中的某个域的数据类型是其结点类型本身。 2、递归算法的大致结构为: a、递归出口 b、递归体 一个递归算法,当其问题求解的规模越来越小时必定有一个递归出口,就是不再递归调用的语句。递归体则是每次递归时执行的语句序列。比如以下简要描述的递归函数中: f(n)=1 (当n=0时) f(n)=n*f(n-1) (当n>0时) 这个递归函数,实际是求n的阶乘。当n=0时,不再递归调用,而当其值置为1;当n>0时,就执行n*f(n-1),这是递归调用。从整体上理解递归算法的大致结构有利于我们在设计递归算法时,从总体上把握算法的正确性。 二、栈与递归的关系:递归的运行 递归在实现过程中是借助于栈来实现的。高级语言的函数调用,每次调用,系统都要自动为该次调用分配一系列的栈空间用于存放此次调用的相关信息:返回地址,局部变量等。这些信息被称为工作记录(或活动记录)。而当函数调用完成时,就从栈空间内释放这些单元,但是,在该函数没有完成前,分配的这些单元将一直保存着不被释放。递归函数的实现,也是通过栈来完成的。在递归函数没有到达递归出口前,都要不停地执行递归体,每执行一次,就要在工作栈中分配一个工作记录的空间给该“层”调用存放相关数据,只有当到达递归出口时,即不再执行函数调用时,才从当前层返回,并释放栈中所占用的该“层”工作记录空间。请大家注意,递归调用时,每次保存在栈中的是局部数据,即只在当前层有效的数据,到达下一层时上一层的数据对本层数据没有任何影响,一切从当前调用时传过来的实在参数重新开始。 由此可见,从严老师P版教材中,利用栈将递归向非递归转化时所采用的方法,实质是用人工写的语句完成了本该系统程序完成的功能,即:栈空间中工作记录的保存和释放。大家在以后的作题时,可以参照以上的分析来理解递归函数的运行过程。实际上,现在的考试中,已经很少见到有学校要求运用栈与实现递归转化为非递归来解题了,所以,大家能理解这个算法更好,不能理解的也不用太担心。我曾就此问题专门向严老师咨询过,严老师说之所以在C版的教材中没有讲到这个算法,也是考虑到了目前国内学校在这方面已经基本不作要求。但是,递归算法的运行过程应该心中有数。 三、递归与递推的关系 “递归算法的执行过程分递推与回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。在回归阶段,当获得最简单的情况后,逐级返回,依次获得稍复杂问题的解。”(摘自于“高程”教材) “递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,3、、、i-1的一系列解,构造出问题规模为i的解。直到最终得到问题规模为N的解。” 由此可见,递推是递归的一个阶段,递归包含着递推。当然,对于实际的算法设计,知不知道这两者之间的关系并不重要,重要的是我们能找出这其中的递推规律和回归时机。 四、适合于用递归实现的问题类型 必须具有两个条件的问题类型才能用递归方法求得: 1、规模较大的一个问题可以向下分解为若干个性质相同的规模较小的问题,而这些规模较小的问题仍然可以向下分解。 2、当规模分解到一定程度时,必须有一个终止条件,不得无限分解。 由此可见适合于递归实现的问题类型有: 1、函数定义是递归的。如阶乘,FIB数列。 2、数据结构递归的相关算法。如:树结构。 3、解法是递归的。如:汉诺塔问题。 五、递归算法的设计 从递归算法的结构来分析,进行递归算法的设计时,无非要解决两个问题:递归出口和递归体。即要确定何时到达递归出口,何时执行递归体,执行什么样的递归体。递归算法算法设计的关键是保存每一层的局部变量并运用这些局部变量。由此,递归算法的设计步骤可从以下三步来作: 1、分析问题,分解出小问题; 2、找出小问题与大问题之间的关系,确定递归出口; 3、用算法语言写出来。 六、递归算法向非递归算法的转化方法 1、迭代法 如果一个函数既有递归形式的定义,又有非递归的迭代形式的定义,则通常可以用循环来实现递归算法的功能。 2、消除尾递归 尾递归,是一类特殊的递归算法。它是指在此递归算法中,当执行了递归调用后,递归调用语句后面再没有其它可以执行的语句了,它即没有用到外层的状态,也没有必要保留每次的返回地址,因为其后不再执行其它任何*作,所以可以考虑消除递归算法。这种情况下,我们可以用循环结构设置一些工作单元来帮助消除尾递归,这些工作单元用于存放一层层的参数。 3、利用栈 当一个递归算法不利于用迭代法和消除尾递归法实现向非递归算法的转化时,可以考虑用栈来实现。实现的过程实际上就是用人工的方法模拟系统程序来保存每层的参数,返回地址,以及对参数进行运算等。 一般情况下,对于递归算法向非递归算法的转化问题,特别是结构定义时的递归算法,我们通常先写出递归算法,然后再向非递归算法转化,而不是首先就尝试写出非递归算法来。
祁同伟 2019-12-02 01:25:44 0 浏览量 回答数 0

回答

“递归”和“迭代”的区别如下: 1、递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。 2、迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。 3、递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
云篆 2019-12-02 01:24:05 0 浏览量 回答数 0

回答

递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。 递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。 特点 递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。 要求 递归算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入); 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
聚小编 2019-12-02 01:24:07 0 浏览量 回答数 0

回答

递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。 递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。 特点 递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。 要求 递归算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入); 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 参考:  病毒木马恶意程序入侵导致的故障有很多恶
管理贝贝 2019-12-02 01:24:00 0 浏览量 回答数 0

回答

递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。 递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。 特点 递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。 要求 递归算法所体现的“重复”一般有三个要求: 一是每次调用在规模上都有所缩小(通常是减半); 二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入); 三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 参考:http://baike.baidu.com/view/1733593.htm
琴瑟 2019-12-02 01:23:58 0 浏览量 回答数 0

回答

一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归算法一般用于解决三类问题: (1)数据的定义是按递归定义的。(Fibonacci函数) (2)问题解法按递归算法实现。(回溯) (3)数据的结构形式是按递归定义的。(树的遍历,图的搜索) 递归的缺点: 递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。递归通俗的讲就是一个函数在其代码中反复调用自身。你应该知道菲波纳契数列,这个数列的定义是f(x)=1?(x=1)f(x)=2?(x=2)f(x)=f(x-1)+f(x-2) (x>2)也就是说从第三项开始的每一项的值都等于是前两项之和。这在数学中叫递推数列--高中数学内容。
聚小编 2019-12-02 01:25:24 0 浏览量 回答数 0

回答

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

回答

递归好处:代码更简洁清晰,可读性更好 递归可读性好这一点,对于初学者可能会反对。实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。一般来说,一个人可能很容易的写出前中后序的二叉树遍历的递归算法,要写出相应的非递归算法就比较考验水平了,恐怕至少一半的人搞不定。所以说递归代码更简洁明了。 递归坏处:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。 个人觉得:非必要时不递归
管理贝贝 2019-12-02 01:25:22 0 浏览量 回答数 0

回答

以下是比较全面的解释,可以看看。 递归算法是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。   递归算法解决问题的特点:   (1) 递归就是在过程或函数里调用自身。   (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。   (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
小哇 2019-12-02 01:24:07 0 浏览量 回答数 0

回答

以下是比较全面的解释,可以看看。 递归算法是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。   递归算法解决问题的特点:   (1) 递归就是在过程或函数里调用自身。   (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。   (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
liujae 2019-12-02 01:25:24 0 浏览量 回答数 0

回答

以下是比较全面的解释,可以看看。 递归算法是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。   递归算法解决问题的特点:   (1) 递归就是在过程或函数里调用自身。   (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。   (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
小哇 2019-12-02 01:24:00 0 浏览量 回答数 0

回答

以下是比较全面的解释,可以看看。 递归算法是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。   递归算法解决问题的特点:   (1) 递归就是在过程或函数里调用自身。   (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。   (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
琴瑟 2019-12-02 01:23:58 0 浏览量 回答数 0

回答

递归好处:代码更简洁清晰,可读性更好 递归可读性好这一点,对于初学者可能会反对。实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。一般来说,一个人可能很容易的写出前中后序的二叉树遍历的递归算法,要写出相应的非递归算法就比较考验水平了,恐怕至少一半的人搞不定。所以说递归代码更简洁明了。 递归坏处:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。
沉默术士 2019-12-02 01:24:57 0 浏览量 回答数 0

回答

递归算法是一种直接或者间接地调用自身的算法。 在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归就是在过程或函数里调用自身。   在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出。
聚小编 2019-12-02 01:25:21 0 浏览量 回答数 0

回答

递归算法是一种直接或者间接地调用自身的算法。 在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归就是在过程或函数里调用自身。   在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出。
行者武松 2019-12-02 01:23:57 0 浏览量 回答数 0

回答

解决某一类问题的计算方法又称算法。算法是个古老的数学概念。16世纪R.笛卡尔创造的解析几何就是用代数来解决几何问题的一种典型的算法。但数学中有一些问题长期找不到解决的算法。人们怀疑根本不存在这种算法。为了证明这一点,必须对算法给出精确的定义。20世纪30年代K.哥德尔提出了算法的一种精确定义,S.C.克林据此定义了递归函数。与此同时,A.M.图灵用图灵机(一种理论计算机)来描述算法,并且证明图灵可计算的函数与递归函数等价。图灵机使人们普遍接受了关于算法的丘奇论题:递归函数是可计算函数的精确的数学描述。递归函数是用数理逻辑的方法定义在自然数集上的可计算函数。如果自然数的一个 n 元集的特征函数是递归函数,就称这个集合为递归集,一个递归函数的值域,称为递归可枚举集。递归集就是算法可判定的集合。递归集都是递归可枚举的,但是存在不是递归集的递归可枚举的集合。递归论的研究使人们把一些长期未解决的问题化为非递归的递归可枚举集,从而严格证明了不存在判定这些问题的算法。这些问题称为不可判定的。递归论进一步研究不可判定的,也就是非递归的递归可枚举集之间的复杂程度问题。1944年E.L.波斯特提出不可解度的概念。又给出了相对可计算性的构造方法。这就使人们开始对不可解度进行比较,并研究不可解度的代数结构。这方面出现了有穷损害优先方法、无穷损害优先方法等多种有力的研究手段,出现了许多有趣的研究成果。对可计算的递归集,也可以研究其计算的复杂性,考虑图灵机上计算的时间,空间,就得到计算时间的长短计算所占空间的多少这两个复杂性。计算复杂性的研究对计算机科学的发展有很大影响和作用。
祁同伟 2019-12-02 01:24:49 0 浏览量 回答数 0

回答

先回答问题。 内存方面,一般情况下递归的开销比非递归大; 运行速度方面,一般情况下递归比非递归快; 代码实现上,难度不一而论,要看具体问题上人脑解决和电脑解决的思路差异大小,一般而言,递归问题用非递归思路和普通问题用递归思路时代码实现都将复杂化; 运行稳定性上,非递归明显占优; 代码量,永远是递归最少; 单论递归算法的低效性,一般指的是其内存开销太大。其他的特性与非递归比没有确定的结果,要试解决的问题而定。 这里有一篇非常之精辟的短文,想要深入了解递归可以看下。 http://hi.baidu.com/ninke/blog/item/e3e244a942b621fd1f17a25e.html-------------------------是的,太浪费堆栈(内存)了,除非万不得已,不要用递归。
马铭芳 2019-12-02 01:25:54 0 浏览量 回答数 0

回答

#include <stdio.h> void main() { float f(int);//函数原型 int n; float sum; printf("你想求谁(整数)的阶乘:"); scanf("%d",&n); sum=f(n); printf("%d!=%.2f/n",n,sum); } float f(int n) { float sum; if(n<0) printf("data error./n"); else if(n==0||n==1) sum=1;//加n==0是因为0也可以求阶乘,在调用函数时可以给实参n赋值为0 else sum=f(n-1)*n; return sum; 递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数). 递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。 递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
沉默术士 2019-12-02 01:24:13 0 浏览量 回答数 0

回答

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。 递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。 递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。 使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。 递归函数是通过调用函数自身来完成任务,而且在每次调用自身时减少任务量。而迭代是循环的一种形式,这种循环不是由用户输入而控制,每次迭代步骤都必须将剩余的任务减少;也就是说,循环的每一步都必须执行一个有限的过程,并留下较少的步骤。
小旋风柴进 2019-12-02 01:24:05 0 浏览量 回答数 0

回答

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。所以,从一定意义上说,人们平时所说的递归就是递归算法。递归程序是将递归算法用程序设计语言来实现的,它是程序,当然也有人说程序是算法描述的一种方法,不管怎么说,递归程序不等同于递归算法。
青衫无名 2019-12-02 01:24:10 0 浏览量 回答数 0

问题

递归算法 怎么判断递归体和递归头

递归算法 怎么判断递归体和递归头...
知与谁同 2019-12-01 20:15:25 460 浏览量 回答数 1

问题

递归算法 怎么判断递归体和递归头

递归算法 怎么判断递归体和递归头...
知与谁同 2019-12-01 20:15:21 469 浏览量 回答数 1

问题

递归程序和递归、递归算法一样吗

递归程序和递归、递归算法一样吗...
知与谁同 2019-12-01 20:15:27 351 浏览量 回答数 1

回答

肯定是停止继续执行,执行递归函数,递归函数完毕后再重新进入函数执行执行到第一个start进入递归,又执行到start又进入递归,又执行到start进入递归,不满足if,退出,回到上一个递归,继续向下执行到one执行递归,不满足if,退出,回到上一个递归,继续向下执行到two.....否则结果会是以下这样很有规律的输出:startonetwostartonetwo
a123456678 2019-12-02 02:41:26 0 浏览量 回答数 0

回答

递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。   递归算法的特点   递归过程一般通过函数或子过程来实现。   递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。   递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。   递归算法解决问题的特点:   (1) 递归就是在过程或函数里调用自身。   (2) 在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。   (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。   递归算法所体现的“重复”一般有三个要求:   一是每次调用在规模上都有所缩小(通常是减半);   二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);   三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。   例子如下:   描述:把一个整数按n(2<=n<=20)进制表示出来,并保存在给定字符串中。比如121用二进制表示得到结果为:“1111001”。   参数说明:s: 保存转换后得到的结果。   n: 待转换的整数。   b: n进制(2<=n<=20)   void   numbconv(char *s, int n, int b)   {   int len;   if(n == 0) {   strcpy(s, "");   return;   }   /* figure out first n-1 digits */   numbconv(s, n/b, b);   /* add last digit */   len = strlen(s);   s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];   s[len+1] = '\0';   }   void   main(void)   {   char s[20];   int i, base;   FILE *fin, *fout;   fin = fopen("palsquare.in", "r");   fout = fopen("palsquare.out", "w");   assert(fin != NULL && fout != NULL);   fscanf(fin, "%d", &base);   /*PLS set START and END*/   for(i=START; i <= END; i++) {   numbconv(s, i*i, base);   fprintf(fout, "%s\n", s);   }   exit(0);   }   递归算法简析(PASCAL语言)   递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写   程序能是程序变得简洁和清晰.   一 递归的概念   1.概念   一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).  -------------------------static void Main(string[] args) ...{ Console.WriteLine(Process2(100)); Console.ReadLine(); } public static int Process2(int i) ...{ //计算1+2+3+4+...+100的值 if (i == 0) return 0; return Process2(i - 1) + i; }
行者武松 2019-12-02 01:24:10 0 浏览量 回答数 0

回答

 递归算法:是一种直接或者间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。   递归算法的特点   递归过程一般通过函数或子过程来实现。   递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。   递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。   递归算法解决问题的特点:   (1) 递归就是在过程或函数里调用自身。   (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。   (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。   递归算法所体现的“重复”一般有三个要求:   一是每次调用在规模上都有所缩小(通常是减半);   二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);   三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。 例子如下:   描述:把一个整数按n(2<=n<=20)进制表示出来,并保存在给定字符串中。比如121用二进制表示得到结果为:“1111001”。   参数说明:s: 保存转换后得到的结果。   n: 待转换的整数。   b: n进制(2<=n<=20)   void   numbconv(char *s, int n, int b)   {   int len;   if(n == 0) {   strcpy(s, "");   return;   }   /* figure out first n-1 digits */   numbconv(s, n/b, b);   /* add last digit */   len = strlen(s);   s[len] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n%b];   s[len+1] = '\0';   }   void   main(void)   {   char s[20];   int i, base;   FILE *fin, *fout;   fin = fopen("palsquare.in", "r");   fout = fopen("palsquare.out", "w");   assert(fin != NULL && fout != NULL);   fscanf(fin, "%d", &base);   /*PLS set START and END*/   for(i=START; i <= END; i++) {   numbconv(s, i*i, base);   fprintf(fout, "%s\n", s);   }   exit(0);   }
行者武松 2019-12-02 01:24:03 0 浏览量 回答数 0

回答

函数的递归调用 一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。 例如有函数f如下: int f(int x) { int y; z=f(y); return z; } 这个函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。下面举例说明递归调用的执行过程。 【例】用递归法计算n! 用递归法计算n!可用下述公式表示: n!=1 (n=0,1) n×(n-1)! (n>1) 按公式可编程如下: long ff(int n) { long f; if(n<0) printf("n<0,input error"); else if(n==0||n==1) f=1; else f=ff(n-1)*n; return(f); } main() { int n; long y; printf("\ninput a inteager number:\n"); scanf("%d",&n); y=ff(n); printf("%d!=%ld",n,y); } 程序中给出的函数ff是一个递归函数。主函数调用ff 后即进入函数ff执行,如果n<0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。 下面我们再举例说明该过程。设执行本程序时输入为5,即求5!。在主函数中的调用语句即为y=ff(5),进入ff函数后,由于n=5,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)。 进行四次递归调用后,ff函数形参取得的值变为1,故不再继续递归调用而开始逐层返回主调函数。ff(1)的函数返回值为1,ff(2)的返回值为1*2=2,ff(3)的返回值为2*3=6,ff(4)的返回值为6*4=24,最后返回值ff(5)为24*5=120。
美人迟暮 2019-12-02 01:25:44 0 浏览量 回答数 0

回答

1、采用自顶向上的递归方法,代码如下: import java.util.Scanner; public class Test { @SuppressWarnings("resource") public static void main(String[] args) { // 从控制台输入一个整数 Scanner in = new Scanner(System.in); int b = in.nextInt(); // 声明一个Test对象,调用cal方法获得结果 Test test = new Test(); long a = test.cal(b); System.out.println(a); } // 通过递归掉调用最终返回结果 public long cal(int number) { // 如果数字为1,则直接返回 if (number == 1) { return 1; } else {// 否则递归求值 return number * cal(number - 1); } } } 2、递归方法:    递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数). 3、特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
游客886 2019-12-02 01:24:03 0 浏览量 回答数 0

回答

递归和非递归只是解决问题的方法的不同,本质还是一样的。 2. 递归算法相对于非递归算法来说效率通常都会更低 2.1 递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等) 2.2 由于编译器对附加的一些栈保护机制会导致递归执行的更加低效 3. 使用循环代替递归算法,通常可以获得更好的执行效率和空间效率,在二叉树层次较深的情况下,采用非递归方式遍历能够有效的提升遍历的性能。
云篆 2019-12-02 01:25:13 0 浏览量 回答数 0

回答

  1 、递归函数的定义:   答:递归函数即自调用函数,在函数体内直接或间接的调用自己,即函数的嵌套是函数本身。   2 、递归方式:递归调用有直接递归和间接递归两种方式。   A :直接递归:在函数中出现调用函数本身。   示例 1 :下面代码求斐波那契数列第 n 项,斐波那契数列第一和第二项是 1 ,后面每一项是前两项之和,即 1 、 1 、 2 、 3 、 5 、 8 、 13  ...。   程序代码:   public class Test {   public static void main(String args[]) {   int x1 = 1;   int sum = 0;   int n = 7;   for (int i = 1; i <= n; i++) {   x1 = func(i);   sum = sum + x1;   }   System.out.println("sum=" + sum);   }   public static int func(int x) {   if (x >2)   return (func(x - 1) + func(x - 2));   else   return 1;   }   }   B :间接递归:指函数中调用了其他函数,而该其他函数有调用了本函数。   示例 2 :用间接递归来计算上述斐波那契数列。   3 、为什么要用递归函数。递归函数的缺点是什么。   答:递归的目的是简化程序设计,使程序易读。   示例 3 :下面不用递归函数继续来计算上述斐波那契数列。   程序代码:   public class Test {   public static void main(String args[]) {   int n=7;   int a=1, b=1, temp;   int sum=2;   for(int i=3; i<=n; i++){   temp=a+b; a=b; b=temp;   sum=sum+temp;   }   System.out.println("sum=" + sum);   }   }   从上面例子我们可以发现虽然非递归函数效率高,但较难编程,可读性较差。递归函数的缺点是增加了系统开销,也就是说,每递归一次,栈内存就多占用一截。   4 、递归的条件:   答:需有完成任务的语句,需满足递归的要求(减小而不是发散)。   5 、递归进阶:   示例 4 :   编程求解:若一头小母牛,从出生起第四个年头开始每年生一头母牛,按次规律,第 n 年时有多少头母牛。   程序代码:   public class Test3 {   public static void main(String args[]) {   int n=10; // 要查看的年数   System.out.println(" 共有 "+cattle(n)+" 头小母牛! ");   }   public static int cattle(int n){   if(n<=0)   return 0;   if(n<=3)   return 1;   return cattle(n-1)+ cattle(n-3);// 此处是递归要好好理解。   }   }   规律:此类问题的递归函数为:   如果要求的是从出生起第四个年头,则递归函数为 cattle(n-1)+ cattle(n-3) ,   如果要求的是从出生起第五个年头,则递归函数为 cattle(n-1)+ cattle(n-4) ,   。。。。   依次类推。   (原代码全部在 JBuilderX 下调试通过)   
行者武松 2019-12-02 01:25:22 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务