精华内容
下载资源
问答
  • python递归

    2020-03-22 16:52:38
    python递归python递归1、什么是递归2、递归的特点3、案例 python递归 1、什么是递归 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中...

    1、什么是递归

    程序调用自身的编程技巧称为递归( recursion)。
    递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

    2、递归的特点

    1、必须有一个明确的结束条件
    2、每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少
    3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    3、案例

    #阶乘之和
    def fn(x):
        if x==1:
            return 1
        def f(x):
            if x==1:
                return 1
            return f(x-1)*x
        return fn(x-1)+f(x)
    n = int(input("请输入值"))
    print("1-{}的阶乘之和是".format(n),fn(n))
    
    展开全文
  • python 递归

    2018-12-18 16:24:03
    python 递归 递归算是一直对我来说比较致命的一点,一直没有办法非常通透的理解。最近在业务上有一段代码几乎想不到非递归的场景。所以在这次加深了对递归的认识。 python 递归的限制 首先递归第一个要考虑的就是...

    python 递归

    递归算是一直对我来说比较致命的一点,一直没有办法非常通透的理解。最近在业务上有一段代码几乎想不到非递归的场景。所以在这次加深了对递归的认识。

    python 递归的限制

    首先递归第一个要考虑的就是什么时候结束。结果条件没写好就会导致调用栈太深,甚至爆栈的危险。python在这里做了最大递归层数的限制。

    sys.getrecursionlimit()
    一般设置为1000。 当然如果你非常有信息可以把值设置得更大一些。通过相应的set 方法。但是这只是对层数的限制,相应的栈大小没有变。还是可能会爆栈,所以还是应该谨慎使用。(目前认为 栈的限制在于对线程栈大小限制不区分语言 ulimit 可以查看).

    深度优先搜索

    关于深度优先搜索,对于树而言他的递归其实是可以预知的,那就是树的深度。(当然,前提是你知道树的深度)在这种情况下基本不用考虑爆栈的危险。为什么使用深度递归搜索呢?因为某些时候把递归转为迭代太耗费脑子了。

    如这一段代码,意义在于同步json和DB之间的数据。如果json dict有不同则新插入数据库。我们会发现在传入到新的函数是会新的值,也就是有状态的转移。而对于非递归的时候几乎只能够说是遍历,而无法很好的修改参数以及恢复参数。

    def location_dfs(tree_node, node_name, parentid=0, level=0):
    
    	location = get_location(name=node_name, parentid=parentid, level=level)
    
    	if not location:
    		location = add_location(name=node_name, parentid=parentid, level=level)
    		log.data('regular_sync_location_tab| new location info: id:%s parentid:%s name:%s level:%s',
    				 location.id, location.parentid, location.name, location.level)
    		print 'add location id:%s name:%s parentid:%s' % (location.id, location.name, location.parentid)
    		add_notify_list(location)
    
    	for key in tree_node:
    		if isinstance(tree_node, dict):
    			next_subtree = tree_node[key]
    		else:
    			next_subtree = {}
    		location_dfs(next_subtree, key, parentid=location.id, level=level + 1)
    

    一开始想看到最末尾也是调用其自身,让我想起了尾递归优化,仔细一看使其不然,代码是在for循环是调用前自身,所以不是尾递归。尾递归应该可以改为return xxx的形式。

    尾递归优化

    尾递归优化定义:尾调用的概念非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。
    一下不属于尾递归

    
    // 情况一
    function f(x){
      let y = g(x);
      return y;
    }
    
    // 情况二
    function f(x){
      return g(x) + 1;
    }
    

    以下属于尾递归

    function factorial (num, total) {
        if (num === 1) return total;
        return factorial(num - 1, num * total);
    }
    

    针对这种情景很多编译器会进行优化。python 编译器没有优化功能,但是有一个装饰器可以实现这个功能,也能让我们更清楚尾递归到底是如何优化的。

    import sys
    
    class TailCallException:
        def __init__(self, args, kwargs):
            self.args = args
            self.kwargs = kwargs
    
    def tail_call_optimized(func):
        def _wrapper(*args, **kwargs):
            f = sys._getframe()
            if f.f_back and f.f_back.f_back and f.f_code == f.f_back.f_back.f_code:
                raise TailCallException(args, kwargs)
    
            else:
                while True:
                    try:
                        return func(*args, **kwargs)
                    except TailCallException, e:
                        args = e.args
                        kwargs = e.kwargs
        return _wrapper
    
    @tail_call_optimized
    def fib(n, a, b):
        if n == 1:
            return a
        else:
            return fib(n-1, b, a+b)
    
    r = fib(1200, 0, 1) #突破了调用栈的深度限制
    

    其核心思想就是:调用栈函数内容是一致的。当检查到3个一样的栈时,就会抛出异常,把参数带上,被上一层的fib捕获,这时候栈已经收缩。while True 内部继续调用,程序继续运行。最终的效果是递归栈的深度不超过3.

    参考:尾递归优化

    展开全文
  • Python递归

    2019-10-08 12:16:43
    Python递归深度有限制,超过限制报错 递归分两个过程 往下调用:分解的过程 往上回溯:综合的过程 注意 要有初始值 值随递归过程变化 一定要有结束条件且能成立 # 递归案例 def func(n): print(n) if n...

    递归

    函数间接或直接调用自身

    • 优点:简洁,理解容易
    • 缺点:对递归深度有限制,消耗资源大
    • Python对递归深度有限制,超过限制报错
    • 递归分两个过程
      1. 往下调用:分解的过程
      2. 往上回溯:综合的过程
    • 注意
      • 要有初始值
      • 值随递归过程变化
      • 一定要有结束条件且能成立
    # 递归案例
    def func(n):
        print(n)
        
        if n == 1:
            return True
            
        return n * func(n-1)
    
    rst = func(10)
    print(rst)
    
    """
    运行结果:
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    3628800
    """
    
    # 斐波那契额数列案例
    def fib(n):
        if n < 1:
            print('请输入大于1的正数')
            return None
        if n == 1 or n == 2:
            return 1
        return fib(n-1) + fib(n-2)
        
    rst = fib(-10)
    print(rst)
    rst = fib(10)
    print(rst)
    
    """
    运行结果:
    请输入大于1的正数
    None
    55
    """
     ``
    
    展开全文
  • python 递归-递归可视化

    万次阅读 2020-07-10 13:44:54
    python 递归-递归可视化 文章目录python 递归-递归可视化1、实现2、递归可视化-Coding 1、实现 2、递归可视化-Coding

    python 递归-递归可视化

    1、实现

    a. 螺旋线

    指定原始单边长度,每画完一条线时,线长-5,右转90度; 以此循环直至线长<5 & >0
    在这里插入图片描述

    b. 分形树

    指定主干的原始长度,每次分支长度-15,直至 0< 长度 < 15
    画枝干时先右转20°画分支, 然后左转40°画分支,最后再右转20°,回到原始位置
    递归调用绘制分形树
    在这里插入图片描述

    c. 谢尔平斯基三角

    使用三路递归算法绘制谢尔平斯基三角

    线绘制一个大三角形,连接三角形的中点,将原三角形分割成4个小三角形,忽略中间的三角形,将剩下的三角形填充同一颜色
    设置绘制层级,每次分割一阶, 层级减1, 直至0
    递归调用绘制图形

    在这里插入图片描述

    2、递归可视化-Coding

    # -*- coding: utf-8 -*-
    
    from turtle import *
    
    
    class HexlixLine:
        myTurtle = Turtle()
        myWin = myTurtle.getscreen()
    
        def draw(self, lineLen):
            """
            递归绘制螺旋线
            """
            # 调整绘图的起点
            self.myTurtle.up()
            self.myTurtle.backward(int(lineLen/2))
            self.myTurtle.left(90)
            self.myTurtle.forward(int(lineLen/2))
            self.myTurtle.right(90)
            self.myTurtle.down()
    
            # 绘制螺旋线
            self.drwaSpiral(self.myTurtle, lineLen)
            # 点击屏幕退出
            self.myWin.exitonclick()
    
        def drwaSpiral(self, myTurtle, lineLen):
            """
            绘制螺旋线
            """
            if lineLen > 0:
                myTurtle.forward(lineLen)
                myTurtle.right(90)
                self.drwaSpiral(myTurtle, lineLen - 5)
    
        def tree(self, branchLen):
            """
            递归绘制分形树
            """
            t = self.myTurtle
            # 调整树的起点
            t.left(90)
            t.up()
            t.backward(360)
            t.down()
            t.color("green")
            # 绘制分形树
            self.drawTree(branchLen, t)
            # 点击退出
            self.myWin.exitonclick()
    
        def drawTree(self, branchLen, t):
            """
            绘制分形树
            """
            if branchLen > 15:
                t.forward(branchLen)
                t.right(20)
                self.drawTree(branchLen-15, t)
                t.left(40)
                self.drawTree(branchLen-15, t)
                t.right(20)
                t.backward(branchLen)
    
    
        def drawTriangle(self, degree):
            """
            递归绘制谢尔平斯基三角形
            """
            t = self.myTurtle
            # 三角形的3顶点坐标
            point = [(-500, -350), (0, 400), (500, -350)]
            # 绘制谢尔平斯基三角形
            self.sierpinski(point, degree, t)
            # 点击时退出
            self.myWin.exitonclick()
    
    
        def triangle(self, point, color, t):
            """
            绘制三角形并填充
            """
            t.fillcolor(color)
            t.up()
            t.goto(point[0])
            t.down()
            t.begin_fill()
            t.goto(point[1])
            t.goto(point[2])
            t.goto(point[0])
            t.end_fill()
        
        def getMid(self, p1, p2):
            """
            获取两点的中点
            """
            return ((p1[0]+p2[0])/2, (p1[1] + p2[1])/2)
    
        def sierpinski(self, points, degree, t):
            """
            绘制谢尔平斯基三角形
            """
            # 谢尔平斯基三角形 色阶
            colorMap = ['blue', 'red', 'green', 'white', 'yellow', 'violet', 'orange', 'black', 'pink']
    
            self.triangle(points, colorMap[degree], t)
            if degree > 0:
                self.sierpinski([points[0], self.getMid(points[0], points[1]), self.getMid(points[0], points[2])], degree - 1, t)
                self.sierpinski([points[1], self.getMid(points[0], points[1]), self.getMid(points[1], points[2])], degree - 1, t)
                self.sierpinski([points[2], self.getMid(points[0], points[2]), self.getMid(points[1], points[2])], degree - 1, t)
    
    
    if __name__ == "__main__":
        hexlixLine = HexlixLine()
        hexlixLine.draw(320)
        hexlixLine.tree(120)
        hexlixLine.drawTriangle(6)
    
    
    
    展开全文
  • Python 递归

    2019-06-11 17:30:04
    一个函数在其定义中调用自身的方法即为递归( recursion)。构成递归需要满足两个条件,第一个是子问题与父问题存在同样的处理逻辑,第二个就是要有递归出口—化简为非递归处理方式。 在某些场景下,使用递归,...
  • 递归:python递归-源码

    2021-02-15 13:25:31
    递归 python递归
  • 移动宽带检查显示 CRM,...Python 递归函数基例2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能CSS布局HTML小编今天和大家分享解的,一般来说是问题的最小规模下的解...
  • 本文实例为大家分享了python递归全排列的实现方法,供大家参考,具体内容如下排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列;全排列:当n==m时,称为全排列;比如:集合{ 1,2,3}的全排列为:{ ...
  • 今天做leetcode周赛碰到一个判断三点共线的问题,好在数学系的我马上反应到了行列式,然鹅行列式展开...# 纯python递归计算行列式 def det(array:list) -> int: """ type array : List[List[float]] """ ass...
  • Python递归函数实例1、打开Python开发工具IDLE,新建‘递归.py'文件,并写代码如下:def digui(n):if n == 0 :print ('')returnprint ('*'*n)digui(n-1)if __name__ == '__main__':digui(5)这里递归打印*号,先打印后...
  • 这篇文章主要介绍了Python递归函数定义与用法,结合具体实例形式分析了Python递归函数的原理、实现技巧与相关注意事项,需要的朋友可以参考下本文实例讲述了Python递归函数定义与用法。分享给大家供大家参考,具体如下...
  • Python递归函数定义与用法示例本文实例讲述了Python递归函数定义与用法。分享给大家供大家参考,具体如下:递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。举个例子...
  • Python递归函数实例1、打开Python开发工具IDLE,新建‘递归.py'文件,并写代码如下:def digui(n):if n == 0 :print ('')returnprint ('*'*n)digui(n-1)if __name__ == '__main__':digui(5)这里递归打印*号,先打印后...
  • 这篇文章主要介绍了Python递归函数定义与用法,结合具体实例形式分析了Python递归函数的原理、实现技巧与相关注意事项,需要的朋友可以参考下本文实例讲述了Python递归函数定义与用法。分享给大家供大家参考,具体如下...
  • 主要介绍了Python递归及尾递归优化操作,结合实例形式分析了Python递归及尾递归优化相关概念、原理、应用与操作技巧,需要的朋友可以参考下
  • python 递归-探索迷宫

    万次阅读 2020-07-10 13:33:59
    python 递归-探索迷宫 文章目录python 递归-探索迷宫1、实现2、探索迷宫-File 1、实现 2、探索迷宫-File 探索迷宫方法 # -*- coding: utf-8 -*- from turtle import * import time class Maze: def __init__(self...
  • 我就废话不多说了,直接上代码吧!...数组累加temp = sum_numbers(num - 1)return num + tempresult = sum_numbers(3)print(result)输出:6补充拓展:python递归计数及结束递归题目:搜索旋转排序数组class Solution...
  • Python 递归函数如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要...
  • python递归求阶乘的方法阶乘:例如 5! 指的是“5的阶乘”,即 5! = 1*2*3*4*5。“递归”就是对自身进行调用的函数。推荐学习:云海天Python教程def f(x):if x == 0:return 0elif x == 1:return 1else:return (x * f...
  • 英文的Recursion从词源上分析只是"re- (again)" + "curs- (come, happen)" 也就是重复发生,再次重现的意思。 而对应的中文翻译 ”递归“ 却表达了两个意思...python递归常见使用汉诺塔树状谢尔宾斯基三角形常见的递...
  • python递归怎么写-问答-阿里云开发者社区-阿里云
  • 递归再特定的场景下,非常实用,巧妙的递归设计能解决很多问题,文章主要列出了递归的各种思想和丰富的使用案例!
  • python递归列出目录及其子目录下所有文件一、前言函数的递归,简单来说,就是函数内部调用自己先举个小例子,求阶乘1 deffactorial(n):2 if n ==0:3 return 14 else:5 return n * factorial(n-1)递归要注意两个事项...
  • 本文内容介绍了python递归函数求n的阶乘,优缺点及递归次数设置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧!递归函数两大特点:1.能够调用函数自身2.至少有一个出口(结束函数自身调用)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,622
精华内容 9,848
关键字:

python递归

python 订阅