递归函数的基本思想 (递归函数的基本情形是什么)
本文目录导航:
递归函数的基本思想
递归函数的基本思想如下:

递归就是方法自己调用自己 递归特点: 有临界点 当一个方法执行完毕,或者遇到retrun,就会返回,函数就是出栈。
待求解问题的解 输入变量x的函数f(x),通过寻找函数g( ), 使得f(x) = g(f(x-1))。
且已知f(0)的值, 就可以通过f(0)和g( )求出f(x)的值。
扩展到多个输入变量x, y, z等, x-1也可以推广到 x - x1 , 只要递归朝着 “出口” 的方向即可。
把一个问题划分成一组子问题, 依次对这些子问题求解。
子问题之间是横向的, 同类的关系 递归: 把一个问题逐级分解成子问题。
子问题与原问题之间是纵向的, 同类的关系。
语法形式上: 在一个函数的运行过程中, 调用这个函数自己。
直接调用: 在fun()中直接执行fun()。
间接调用: 在fun1()中执行fun2(); 在fun2()中又执行fun1() 递归与枚举的区别。
递归的三个要点:
递归式:如何将原问题划分成子问题。
递归出口: 递归终止的条件, 即最小子问题的求解,可以允许多个出口 。
界函数: 问题规模变化的函数, 它保证递归的规模向出口条件靠拢,求阶乘的递归程序。
递归的基本思想是什么?
递归的基本思想是:自己调用自己。
递归是一种常见的解决问题的方法,即把问题逐渐简单化。
递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。
利用递归可以用简单的程序来解决一些复杂的问题。
比如:斐波那契数列的计算、汉诺塔、快排等问题。
递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度要比循环慢的多,所以在使用递归时要慎重。
简单地说,递归是重复调用函数自身实现循环。
迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
递归循环中,遇到满足终止条件的情况时逐层返回来结束。
迭代则使用计数器结束循环。
当然很多情况都是多种循环混合采用,这要根据具体需求。
递归的例子,比如给定一个整数数组,采用折半查询返回指定值在数组中的索引,假设数组已排序,为方便描述,假设元素都为正数,数组长度为2的整数倍。
对递归的理解
递归和循环是等价的,只不过实现方式不同而已。
一个等价的例子求1到10累加:循环 用For循环在循环体内做累加计算,终止条件是 控制变量10递归 累加计算和增1计算做递归公式,递归条件 控制变量=10递归的优缺点递归的代码简洁复杂度低 递归在处理复杂嵌套时,具备了循环无法比拟的优势。
递归的内存使用效率略高 递归使用栈的空间,随着循环的进行,前面递归函数不能结束后面的递归函数不断增加,栈空间增加,但到后期,递归函数开始完结,栈空间会迅速释放。
相比之下,循环体主要使用堆空间,循环过程中堆空间不断增加,循环结束后不会立即释放堆空间。
递归容易引起栈内存的溢出 由于递归函数是动态申请栈空间,通过编译和静态代码解析,无法发现内存的溢出的问题。
因此,递归对程序员的技术能力要求较高。
理论上递归的执行速度略快 这是由于栈的读写速度要高于堆。