精华内容
下载资源
问答
  • 递归函数的优缺点

    2020-08-17 16:36:28
    递归由于是函数调用自身,而函数调用是消耗时间和空间。每一次函数调用,都需要在内存栈中分配空间以保存参数,返回值和临时变量。而往栈中压入和弹出数据也都需要时间,所以降低了效率。 2、重复计算: 递归中...

    优点:

    1. 代码简洁。
    2. 易于理解

    缺点:

    1、时间和空间的消耗比较大:

    递归由于是函数调用自身,而函数调用是消耗时间和空间的。每一次函数调用,都需要在内存栈中分配空间以保存参数,返回值和临时变量。而往栈中压入和弹出数据也都需要时间,所以降低了效率。

    2、重复计算:

    递归中又很多计算都是重复的,递归的本质时把一个问题分解成两个或多个问题,多个问题存在重叠的部分,即存在重复计算。

    如斐波那契数列的递归实现。

    3、栈溢出:

    递归可能存在栈溢出,每次调用时都会在内存栈中分配空间。

    而栈空间的容量是有限的,当调用的次数太多,就可能会超出栈的容量,造成调用栈溢出。

    展开全文
  • 对于求 n!,你可能会问,为何要用递归?有何优势?答案并不复杂,利用递归可以使算法逻辑变得非常简单。因为递归过程每一步用...递归的另一个特点在于,它只关心自己下一层细节,而并不关心更下层细节。你...

    对于求 n!,你可能会问,为何要用递归?有何优势?答案并不复杂,利用递归可以使算法的逻辑变得非常简单。因为递归过程的每一步用的都是同一个算法,计算机只需要自顶向下不断重复即可。

    具体到阶乘的计算,无非就是某个数字 n 的阶乘,变成这个数乘以 n-1 的阶乘。因此,递归的法则就两条:一是自顶而下(从目标直接出发),二是不断重复。

    递归的另一个特点在于,它只关心自己下一层的细节,而并不关心更下层的细节。你可以理解为,递归的简单源自它只关注“当下”,把握“小趋势”,虽然每一步都简单,但一直追寻下去,也能获得自己独特的精彩。

    下面我们就以计算阶乘为例,分别使用递推和递归方式实现,见例 1,读者可体会二者的区别。

    【例 1 】利用递推和递归方式分别计算 n!(iterative-recursive.py)。

    #用正向递推的方式计算阶乘

    def iterative_fact(n):

    fact = 1

    for i in range(1, n + 1):

    fact *= i

    return fact

    #用逆向递归的方式计算阶乘

    def recursive_fact(n):

    if n <= 1 :

    return n

    return n * recursive_fact(n - 1)

    #调用递推方法计算

    num = 5

    result = iterative_fact(num)

    print("递推方法:{} != {}".format(num, result))

    #调用递归方法计算

    result = recursive_fact(num)

    print ("递归方法:{} != {}".format(num,result))

    程序执行结果为:

    递推方法:5 != 120

    递归方法:5 != 120

    第 02~06 行定义了一个递推计算阶乘的函数 iterative_fact( ),函数内部采用 for 循环的方式来计算结果。在 for 循环控制过程中使用了 range( ) 函数,由于 range( ) 的取值区间是左闭右开的,最后一个值取不到,所以在第 04 行执行了 n+1 操作。

    第 09~12 行定义一个递归函数 recursive_fact( ),采用递归的方式计算结果。

    第 17 行和第 20 行用到了 Python 的格式化输出。在 Python 中,一切皆对象。用双引号引起来的字符串“递归方法:{}!= {}”,实际上是一个 str 对象。既然是对象,它就会有相应的方法成员,format( ) 就是用于格式化输出的方法,因此可以通过“对象.方法名”的格式来调用合适的方法。

    字符串中的花括号{ }表示输出占位符,第 1 个占位符{ }用于输出 format( ) 函数中第 1 个变量,第 2 个占位符{ }用于输出 format( ) 函数中第 2 个变量,以此类推。

    递归函数的优点在于,定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但正向递推(即循环)的逻辑不如逆向递归的逻辑清晰。

    对于递推的实现,这里用到了前面章节中讲到的 for 循环语句,以 1 为基数不断循环相乘,最终得出阶乘的结果。而在递归实现的操作中,这里通过对方法本身压栈和弹栈的方式,将每一层的结果逐级返回,通过逐步累加求得结果。

    recursive_fact(5)的计算过程如下。

    ===> recursive_fact(5)

    ===> 5 * recursive_fact(4)

    ===> 5 * (4 * recursive_fact(3))

    ===> 5 * (4 * (3 * recursive_fact(2))

    ===> 5 * (4 * (3 * (2 * recursive_fact(1))))

    ===> 5 * (4 * (3 * (2 * 1)))

    ===> 5 * (4 * (3*2))

    ===> 5 *(4*6)

    ===> 5 * 24

    ===> 120

    需要注意的是,虽然递归有许多的优点,但缺点也很明显。那就是,使用递归方式需要函数做大量的压栈和弹栈操作,由于压栈和弹栈涉及函数执行上下文(context)的现场保存和现场恢复,所以程序的运行速度比不用递归实现要慢。

    此外,大量的堆栈操作消耗的内存资源要比非递归调用多。而且,过深的递归调用还可能会导致堆栈溢出。如果操作不慎,还容易出现死循环。因此读者编写代码时需要多加注意,一定要设置递归操作的终止条件。

    展开全文
  • 对于求 n!,你可能会问,为何要用递归?有何优势?答案并不复杂,利用递归可以使算法逻辑变得非常简单。因为递归过程每一步用...递归的另一个特点在于,它只关心自己下一层细节,而并不关心更下层细节。你...

    对于求 n!,你可能会问,为何要用递归?有何优势?答案并不复杂,利用递归可以使算法的逻辑变得非常简单。因为递归过程的每一步用的都是同一个算法,计算机只需要自顶向下不断重复即可。

    具体到阶乘的计算,无非就是某个数字 n 的阶乘,变成这个数乘以 n-1 的阶乘。因此,递归的法则就两条:一是自顶而下(从目标直接出发),二是不断重复。

    递归的另一个特点在于,它只关心自己下一层的细节,而并不关心更下层的细节。你可以理解为,递归的简单源自它只关注“当下”,把握“小趋势”,虽然每一步都简单,但一直追寻下去,也能获得自己独特的精彩。

    下面我们就以计算阶乘为例,分别使用递推和递归方式实现,见例 1,读者可体会二者的区别。

    【例 1 】利用递推和递归方式分别计算 n!(iterative-recursive.py)。

    #用正向递推的方式计算阶乘

    def iterative_fact(n):

    fact = 1

    for i in range(1, n + 1):

    fact *= i

    return fact

    #用逆向递归的方式计算阶乘

    def recursive_fact(n):

    if n <= 1 :

    return n

    return n * recursive_fact(n - 1)

    #调用递推方法计算

    num = 5

    result = iterative_fact(num)

    print("递推方法:{} != {}".format(num, result))

    #调用递归方法计算

    result = recursive_fact(num)

    print ("递归方法:{} != {}".format(num,result))

    程序执行结果为:

    递推方法:5 != 120

    递归方法:5 != 120

    第 02~06 行定义了一个递推计算阶乘的函数 iterative_fact( ),函数内部采用 for 循环的方式来计算结果。在 for 循环控制过程中使用了 range( ) 函数,由于 range( ) 的取值区间是左闭右开的,最后一个值取不到,所以在第 04 行执行了 n+1 操作。

    第 09~12 行定义一个递归函数 recursive_fact( ),采用递归的方式计算结果。

    第 17 行和第 20 行用到了 Python 的格式化输出。在 Python 中,一切皆对象。用双引号引起来的字符串“递归方法:{}!= {}”,实际上是一个 str 对象。既然是对象,它就会有相应的方法成员,format( ) 就是用于格式化输出的方法,因此可以通过“对象.方法名”的格式来调用合适的方法。

    字符串中的花括号{ }表示输出占位符,第 1 个占位符{ }用于输出 format( ) 函数中第 1 个变量,第 2 个占位符{ }用于输出 format( ) 函数中第 2 个变量,以此类推。

    递归函数的优点在于,定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但正向递推(即循环)的逻辑不如逆向递归的逻辑清晰。

    对于递推的实现,这里用到了前面章节中讲到的 for 循环语句,以 1 为基数不断循环相乘,最终得出阶乘的结果。而在递归实现的操作中,这里通过对方法本身压栈和弹栈的方式,将每一层的结果逐级返回,通过逐步累加求得结果。

    recursive_fact(5)的计算过程如下。

    ===> recursive_fact(5)

    ===> 5 * recursive_fact(4)

    ===> 5 * (4 * recursive_fact(3))

    ===> 5 * (4 * (3 * recursive_fact(2))

    ===> 5 * (4 * (3 * (2 * recursive_fact(1))))

    ===> 5 * (4 * (3 * (2 * 1)))

    ===> 5 * (4 * (3*2))

    ===> 5 *(4*6)

    ===> 5 * 24

    ===> 120

    需要注意的是,虽然递归有许多的优点,但缺点也很明显。那就是,使用递归方式需要函数做大量的压栈和弹栈操作,由于压栈和弹栈涉及函数执行上下文(context)的现场保存和现场恢复,所以程序的运行速度比不用递归实现要慢。

    此外,大量的堆栈操作消耗的内存资源要比非递归调用多。而且,过深的递归调用还可能会导致堆栈溢出。如果操作不慎,还容易出现死循环。因此读者编写代码时需要多加注意,一定要设置递归操作的终止条件。

    展开全文
  • 递归函数优缺点

    千次阅读 2020-07-15 16:56:15
    递归函数的优点是定义简单,逻辑清晰。理论上,所的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当...

    递归函数的优点是定义简单,逻辑清晰。理论上,所的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
    使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

    解决递归函数缺点的方法:
    解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。
    尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
    例:

    def fact(n):
        if n==1:
            return 1
        return n * fact(n - 1)
    ===> fact(5)
    =
    ===> 5 * fact(4)
    =
    ===> 5 * (4 * fact(3))
    =
    ===> 5 * (4 * (3 * fact(2)))
    =
    ===> 5 * (4 * (3 * (2 * fact(1))))
    =
    ===> 5 * (4 * (3 * (2 * 1)))
    =
    ===> 5 * (4 * (3 * 2))
    =
    ===> 5 * (4 * 6)
    =
    ===> 5 * 24
    =
    ===> 120

    修改后:

    def fact_iter(num, product):
        if num == 1:
            return product
        return fact_iter(num - 1, num * product)
    ===> fact_iter(5, 1)
    =
    ===> fact_iter(4, 5)
    =
    ===> fact_iter(3, 20)
    =
    ===> fact_iter(2, 60)
    =
    ===> fact_iter(1, 120)
    =
    ===> 120

     

    展开全文
  • 递归算法的优缺点.pdf

    2020-07-16 06:44:45
    实用标准文案 递归算法的优缺点 1 优点 结构清晰可读性强而且容易用数学归纳法来证明算法的正确性 因此它为设计 算法调试程序带来很大方便 2 缺点 递归算法的运行效率较低 无论是耗费的计算时间还是占用的存储空间都...
  • 函数递归的优缺点

    千次阅读 2015-02-04 21:01:55
    说说函数调用的优缺点。 优点:实现容易。 缺点: 1.效率较低。递归是有时间和空间消耗的。另外,递归有可能很多计算都是重复的,从而给性能带来很大的负面影响。因为递归的本质是把一个问题分解成连个或者多个小...
  • 主要介绍了python递归函数求n阶乘,优缺点及递归次数设置方式,具有很好参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 什么是递归,递归的优缺点Prerequisite: Recursion in C language 先决条件: C语言递归 递归函数 (Recursive function ) A function which calls itself is a recursive function. There is basically a ...
  • 递归函数两大特点: 1.能够调用函数自身 2.至少有一个出口(结束函数自身调用) 函数实现: def calnum(num): if num != 1: # 递归调用自身函数 csum = num * calnum(num - 1) else: # 设置递归出口 csum ...
  • python的递归函数解析

    2020-08-23 17:01:21
    1.递归函数的定义 a.定义:在一个函数里再次调用这个函数本身 b.最大的递归层数是:997 2.递归的特性 a.... b.... c.... d....3.递归函数的优缺点 a.递归函数的优点:定义简单,逻辑清晰,理论上,可以说所有的递归...
  • python:递归函数

    2018-01-08 14:46:00
    1,初识递归函数 1)什么是递归函数? 在函数中自己调用自己叫做递归函数 递归函数超过一定程度会报错。---RecursionError: maximum recursion dep th ...3)递归函数的优缺点 #如果递归次数太多,就不适合...
  • 递归和循环优缺点详解

    千次阅读 2017-10-23 11:11:18
    优缺点分析 递归 虽然有代码简洁优点,但是时间和空间消耗比较大。每一次函数调用都需要在内存栈中分配空间以保存参数,返回地址以及临时变量,而且往栈里面压入数据和弹出都需要时间。  另外递归会有重复
  • 递归和循环优缺点 比较

    千次阅读 2019-09-02 10:58:45
    递归好处:代码更简洁清晰。一般来说,一个人可能很容易写出前中后序二叉树遍历的递归算法,...一般尾递归(即最后一句话进行递归)和单向递归函数中只有一个递归调用地方)都可以用循环来避免递归,更复杂...
  • 递归的优缺点

    2019-07-03 11:27:45
    1.递归由于是函数调用自身,而函数调用是有时间和空间消耗:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率 2.递归中很多计算都...
  • 使用递归的优缺点

    千次阅读 2019-07-23 20:54:22
    递归由于是函数调用自身,而函数的调用时消耗时间和空间的,每一次函数调用,都需要在内存栈中分配空间以保存参数,返回值和临时变量,而往栈中压入和弹出数据也都需要时间,所以降低了效率。 2、重复计算 递归中...
  • 循环和递归的优缺点

    2019-10-15 15:54:11
    循环和递归的优缺点 1、使用前提 需要重复的多次的计算相同的问题,会用到递归和循环 2、百度百科定义: 递归: 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个...
  • 优缺点分析 递归 虽然有代码简洁优点,但是时间和空间消耗比较大。每一次函数调用都需要在内存栈中分配空间以保存参数,返回地址以及临时变量,而且往栈里面压入数据和弹出都需要时间。 另外递归会有重复计算...
  • 递归的定义和优缺点

    2020-11-01 19:39:07
    递归的定义和优缺点   递归算法是一种直接或者间接地调用自身算法过程。在计算机编写程序中, 递归算法对解决一大类问题是十分有效,它往往使算法描述简洁而且易 于理解。 递归算法解决问题特点:  (1) ...
  • 在C语言中,递归指的是函数在函数体内部...其实递归函数的使用主要抓住两点,第一是主问题与子问题之间的拆分与组合关系,第二就是递归的结束条件,清楚这两个要素再来编写递归函数就会简单多了。  但是递归函数也有
  • 递归和循环的优缺点

    2021-03-31 11:37:10
    递归函数调用自己本身,而函数调用是有时间和空间消耗,每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址和临时变量,而且往栈里压入数据和弹出数据都需要时间. 递归有可能很多计算都是重复 ...
  •    递归函数与非递归函数区别在于:   递归代码写出来思路清晰,可读性强。   而非递归效率高。   递归和非递归作为解决问题手段,各有利弊,我们应该熟悉并掌握各自特性,对待不同问题,做出最优算法。...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 302
精华内容 120
关键字:

递归函数的优缺点