精华内容
下载资源
问答
  • 递归和迭代的区别

    2020-09-30 18:07:23
    诚然,在理论上,递归和迭代时间复杂度方面是等价(在不考虑函数调用开销和函数调用产生堆栈开销),但实际上递归确实效率比迭代低,既然这样,递归没有任何优势,那么是不是就,没有使用递归必要了,

    所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。

    往往有这样的观点:能不用递归就不用递归,递归都可以用迭代来代替。

    诚然,在理论上,递归和迭代在时间复杂度方面是等价的(在不考虑函数调用开销和函数调用产生的堆栈开销),但实际上递归确实效率比迭代低,既然这样,递归没有任何优势,那么是不是就,没有使用递归的必要了,那递归的存在有何意义呢?

    万物的存在是需要时间的检验的,递归没有被历史所埋没,即有存在的理由。从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的。但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样。这也是为什么在结构设计时,通常采用递归的方式而不是采用迭代的方式的原因,一个极典型的例子类似于链表,使用递归定义及其简单,但对于内存定义(数组方式)其定义及调用处理说明就变得很晦涩,尤其是在遇到环链、图、网格等问题时,使用迭代方式从描述到实现上都变得不现实。 因而可以从实际上说,所有的迭代可以转换为递归,但递归不一定可以转换为迭代。

    采用递归算法需要的前提条件是,当且仅当一个存在预期的收敛时,才可采用递归算法,否则,就不能使用递归算法。

    递归其实是方便了程序员难为了机器,递归可以通过数学公式很方便的转换为程序。其优点就是易理解,容易编程。但递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。

    而迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。

    因而,“能不用递归就不用递归,递归都可以用迭代来代替”这样的理解,还是辩证的来看待,不可一棍子打死。

    展开全文
  • 递归和迭代

    2016-05-13 09:43:54
    辩证看递归和迭代 所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构查询和访问。递归使用可以使代码更简洁清晰,可读性更好(对于初学者到...诚然,在理论上,递归和迭代时间复杂度方面是等价

    辩证看递归和迭代

    所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。

    往往有这样的观点:能不用递归就不用递归,递归都可以用迭代来代替。

    诚然,在理论上,递归和迭代在时间复杂度方面是等价的(在不考虑函数调用开销和函数调用产生的堆栈开销),但实际上递归确实效率比迭代低,既然这样,递归没有任何优势,那么是不是就,没有使用递归的必要了,那递归的存在有何意义呢?

    万物的存在是需要时间的检验的,递归没有被历史所埋没,即有存在的理由。从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的。但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样。这也是为什么在结构设计时,通常采用递归的方式而不是采用迭代的方式的原因,一个极典型的例子类似于链表,使用递归定义及其简单,但对于内存定义(数组方式)其定义及调用处理说明就变得很晦涩,尤其是在遇到环链、图、网格等问题时,使用迭代方式从描述到实现上都变得不现实。因而可以从实际上说,所有的迭代可以转换为递归,但递归不一定可以转换为迭代。

    采用递归算法需要的前提条件是,当且仅当一个存在预期的收敛时,才可采用递归算法,否则,就不能使用递归算法。

    递归其实是方便了程序员难为了机器,递归可以通过数学公式很方便的转换为程序。其优点就是易理解,容易编程。但递归是用机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。

    而迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。

    因而,“能不用递归就不用递归,递归都可以用迭代来代替”这样的理解,还是辩证的来看待,不可一棍子打死。*/

    (2) 递归实现机制 
        每一次递归调用,都用一个特殊的数据结构""记录当前算法的执行状态,特别地设置地址栈,用来记录当前算法的执行位置,以备回溯时正常返回。递归模块的形式参数是普通变量,每次递归调用得到的值都是不同的,他们也是由""来存储。 

    展开全文
  • 递归问题的时间复杂度分析广泛存在于分治法DP中,根据算法导论的记载,可以使用主定理的公式直接计算。另外,这篇文章介绍一下使用迭代手算的过程。 主定理 迭代计算 有一点需要说明:2^k*T(n/2^k)...

    2017-12-30 17:01:18

    递归问题的时间复杂度分析广泛存在于分治法和DP中,根据算法导论的记载,可以使用主定理的公式直接计算。另外,这篇文章介绍一下使用迭代手算的过程。

    • 主定理

    • 迭代计算

    有一点需要说明:2^k*T(n/2^k) = 2^k*T(1) := 2^k*O(1) = n*O(1) = O(n)

    转载于:https://www.cnblogs.com/hyserendipity/p/8150542.html

    展开全文
  • 递归和迭代的区别是什么? 答:迭代式调别人,而递归是调自己 递归能不能改为迭代? 答:可以 那么递归的实质是什么?今天就说一下递归的实质 1.递归的实质:压系统栈 压到栈里的是当前的所有信息,包括当前跑...

    说到递归,总会提到这么几个问题:
    递归和迭代的区别是什么?
    答:迭代式调别人,而递归是调自己
    递归能不能改为迭代?
    答:可以
    那么递归的实质是什么?今天就说一下递归的实质

    1.递归的实质:压系统栈

    压到栈里的是当前的所有信息,包括当前跑到多少行,当前的参数和函数内的参数变量,等等
    返回后再进行弹栈,然后读取弹栈后栈顶空间的信息,也就是返回到调用的地方。
    我们也常常会说,递归可能会导致内存溢出也就是因为栈太过深了才可能会导致内存溢出。
    递归可以改成迭代的原因就是,递归是系统在帮我们压栈,我们当然可以自己去申请栈空间进行操作,所以当然是可以改成迭代的。

    2.递归空间复杂度

    一般的空间复杂度可以使用master公式计算:

    T(N) = aT(n/b) + O(N^d)
    T(N):父问题的样本量
    a:调用模块发生的次数
    T(N/b):子问题的样本量
    O(N^d):除去子问题调用过程外,剩下部分的时间复杂度
    1) log(b,a) > d -> 复杂度为O(N^log(b,a))
    2) log(b, a) = d -> 复杂度为O(N^d * logN)
    2) log(b, a) < d -> 复杂度为O(N^d)

    举个例子:

        /*
         * 递归二分求最大数
         */
        public static int getMaxNum(int[] arr, int L, int R) {
            // 递归结束条件:只剩下一个数
            if(L == R)
                return arr[L];
    
            int mid = L +((R - L) >> 1);  //位运算取中值
            int leftMax = getMaxNum(arr, L, mid);  //T(N/2)
            int rightMax = getMaxNum(arr, mid + 1, R);  //T(N/2)
    
            return Math.max(leftMax, rightMax);  //O(1)
        }
    
        // for test
        public static void main(String[] args) {
            int[] arr = {2, 3, 1, 6, 5};
            System.out.println("max = " + getMaxNum(arr, 0, arr.length - 1));
        }

    从以上代码中分析
    1.递归过程:
    主函数调用getMax方法,第一次压栈是在int leftMax = getMaxNum(arr, L, mid);处,此时存入栈中的信息有:此时代码运行到的行数、该方法的参数:L = 0,mid = 2等,将此时的所有信息保存在申请的栈空间中,然后再进入调的getMaxNum方法中。。。一旦当前的L == R,即触发了return arr[L]; 此时进行弹栈操作,读取弹栈后的栈顶的信息,完全还原当时的信息,再继续执行。
    2.递归时间复杂度的计算
    T(N) = aT(n/b) + O(N^d)
    T(N) = 2T(n/2) + O(N^0)
    a = 2,b = 2,d = 0
    可以使用master公式:
    满足:log(b,a) > d -> 复杂度为O(N^log(b,a))
    时间复杂度即为:O(N^1) = O(N)

    展开全文
  • 两个问题来看python的递归和迭代。 这里借鉴了:https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ ...1)求1至n和 1+2+3+…+n def recursive(n: int): ""
  • 写出斐波那契数列的递归迭代代码,并分析时间和空间复杂度。 斐波那契数列指是这样一个数列:1、1、2、3、5、8、13、21、……  用数学公式表示出来就是:  F(1)= 1,F(2)=1 (n=1,2)  F(n)=F(n-1)+ F...
  • 递归和迭代的对比

    2018-09-29 13:54:47
    为什么使用迭代就快,而使用递归就会变得慢呢?我们都知道,递归调用实际上是函数自己在调用自己,而函数调用开销是很大...并非如此,当我们在遇到同一个问题时,如果递归解决时间和空间)复杂度不明显优于...
  • 关于递归和迭代分别的时间复杂度,递归的时间复杂度是O(N),而迭代的时间复杂度是O(logN),由y=N 和Y=logN两条曲线我们知道,一定是O(logN)更优一些。以下是两段代码,和傻瓜式测效率的代码。&lt;?php function...
  • 时间复杂度和空间复杂度简单讲解

    万次阅读 多人点赞 2018-01-07 12:55:26
    文章最后,举例使用二分查找和斐波那契的递归和迭代方法,分别说明时间和空间复杂度。 时间复杂度: 首先要说的是,时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。 当我们面前有多...
  • 计算递归式T(n)=2T(n/2)+n^2的时间复杂度。 考虑递归式: T(n)=2T(n/2)+n^2 可将其化为: T(n)=T(n/2)+T(n/2)+n^2 于是可以画一棵递归树,对于一个节点,节点的值为非函数项,再将式中每一个函数项向下迭代,式...
  • 斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……接下来我们将以斐波那契数列为例,分析递归和迭代的区别。通常情况下...
  • 递归迭代的区别

    2021-03-01 20:39:04
    递归(recursion):递归常被用来描述以自相似方法重复事物过程,在数学和计算机科学中,指是在函数定义中使用函数自身方法。(A调用A) 迭代(iteration):重复反馈过程活动,...理论上递归和迭代时间复杂度
  • 枚举算法,递归与分治策略,递归迭代的思想、求最大值最小值、线性查找、二分查找与冒泡排序以及选择与交换排序、插入希尔排序。本课程除了强调经典的算法理论模型,亦兼顾编程实践能力。力图使得学员面对复杂...
  • 递归dfs是一个树结构,从字面可以其理解为重复“递推”和“回归”过程,当“递推”到达底部时...理论上递归和迭代时间复杂度方面是一样,但实际应用中(函数调用和函数调用堆栈开销)递归比迭代效率要低。 ...
  • 文章最后,举例使用二分查找和斐波那契的递归和迭代方法,分别说明时间和空间复杂度。 时间复杂度: 首先要说的是,时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。 当我们面前有多个算法...
  • 递归迭代

    2009-12-28 10:56:00
    对于递归迭代的关系,也许很多人都不是很清晰,其实本质上递归与迭代时间复杂度方面是等价的(在不考虑函数调用开销函数调用产生的堆栈开销),而递归主要是每递归一次,都会在栈中分配函数的空间,造成空间消耗...
  • 二叉搜索树插入结点运行结果 结果分析 第一种算法用递归实现二叉树结点插入,思路简单,但是容易溢栈。 ... 根据二叉查找树的定义,若插入节点的值若大于当前节点的值,则继续与当前...两种算法的时间复杂度 二叉
  • 文章最后,举例使用二分查找和斐波那契的递归和迭代方法,分别说明时间和空间复杂度。 时间复杂度:  首先要说的是,时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。  当我们面前有多个...
  • (分析时间复杂度及空间复杂度) 迭代算法   #define _CRT_SECURE_NO_WARNINGS   #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;assert.h&gt; ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 258
精华内容 103
关键字:

递归和迭代的时间复杂度