Python3 学习笔记14_递归函数_20180305

【SLAM】探索explore_lite在移动机器人自主建图中的高效边界检测策略 本文深入解析了explore_lite在移动机器人自主建图中的应用,重点探讨了其高效的贪婪边界检测策略。该工具包专为资源受限平台设计,通过直接利用SLAM生成的地图信息,以极低的计算开销实现快速、稳定的未知区域探索,并与move_base导航框架无缝协作,是轻量级机器人自主探索的优选方案。 阅读详情
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com

#****************************************************
#                   Python3 函数              *
#****************************************************
print ("--------------------分割线------------------")

#============
# 递归函数
#============
# 递归函数:直接或间接的调用函数自身。

# 阶乘 n! = 1*2*3*4*...*n
def fact1(n):
    if n == 1:
        return 1
    return n * fact1(n - 1)

print( fact1(3) )                   # 6

'''

===> fact(3)
===> 3 * fact(2)
===> 3 * (2 * fact(1))
===> 3 * (2 * 1)
===> 3 * 2
===> 6

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种
数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回
栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多
就会导致栈溢出。
'''
# print( fact1(1000) )
# 报错:maximum recursion depth exceeded in comparison
print ("--------------------分割线------------------")

'''
解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是
一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含
表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调
用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就
不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的
乘积传入到递归函数中
'''
def  fact2(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num-1, num*product)

print( fact2(3) )                   # 6
'''
可以看到,return fact_iter(num - 1, num * product)仅返回递归函数本身,
num - 1和num * product在函数调用前就会被计算,不影响函数调用。

fact2(3)对应的fact_iter(3, 1)的调用如下:

===> fact_iter(3, 1)
===> fact_iter(2, 3)
===> fact_iter(1, 6)
===> 6
尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导
致栈溢出。

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优
化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

小结:
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是
等价的,没有循环语句的编程语言只能通过尾递归实现循环。

Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
'''
基于深度学习的柑橘病害检测系统——YOLOv8 + UI界面 + 数据集 深度学习是机器学习的一种重要分支,它通过构建多层的神经网络(尤其是卷积神经网络CNN)来从大规模的数据中学习特征。近年来,深度学习特别是在计算机视觉领域取得了显著的进展,成为图像分类、目标检测、图像分割等任务的主要技术。对于农业病害检测问题,深度学习通过对大量带标签的病害图像进行训练,能够自动识别不同类型的病害,并判断病害的程度。通过图像中目标(病害区域)的边界框,可以快速定位病害区域,进一步分析其影响范围。 阅读详情

相关推荐

STM32CubeMX实战:TIM定时器中断配置避坑指南(附100ms精准定时代码)

本文深入解析STM32CubeMX配置TIM定时器中断的常见误区与避坑技巧,重点阐述时钟源、预分频器与自动重装载值的精准计算方法。通过实战案例,提供一份可直接复用的100ms精准定时中断代码模板,并分享调试验证方法,帮助开发者构建稳定可靠的嵌入式系统心跳。

grafana8visual的博客 500

Python3中的递归函数

目录 1:递归函数 2:递归函数的最大深度 3:重置递归函数的最大深度 4递归函数示例 4.1计算阶乘 n! 4.2:斐波纳契数列 4.3:求x的n次方 1:递归函数 递归函数就是在函数中调用它自身,其主要用于将复杂问题分解为多个子问题,然后再对子问题进行拆分,分解成更小的问题,直到不能再拆分为止。 为了防止递归函数无休止地进行,必须在函数内有终止条件。 2:递归函数的最...

ixusy88的博客 1423

Windows平台高效BLE调试工具开发指南

本文为开发者提供了一份在Windows平台上开发高效BLE调试工具的详细指南。文章深入探讨了使用32feet.NET库进行蓝牙低功耗设备扫描、连接、数据通信及进阶功能开发的实战经验,旨在帮助开发者打造功能自定义、性能优化的专属调试利器,显著提升物联网和嵌入式设备的调试效率。

weixin_29201933的博客 256

python3 递归函数,python3的递归函数 | 吴老二

今天要说的是python3的递归函数,首先我们要理解什么是递归函数,什么时候可以用到递归函数,递归函数的好处是什么。我们先举个例子看一下,先写一个计算1到10的和,我们使用循环的话就需要使用for循环一下1到10,然后每循环一次相加一次。如果使用递归就每次都重复调用函数本身即可,看下面的代码:#!/usr/bin/python3#coding:utf-8#~~~~~~~~~~~~www.wulao...

weixin_36070282的博客 339

MATLAB实战:64QAM通信系统仿真全流程解析(附误码率优化技巧)

本文提供了一份完整的64QAM通信系统MATLAB仿真实践指南。从系统架构设计、发射端格雷码映射与脉冲成形,到信道建模、接收端同步与均衡,详细解析了全链路实现流程。文章重点分享了误码率曲线与理论值偏差的排查清单和深度优化技巧,帮助工程师构建工业级精度的仿真模型,解决高阶调制系统仿真的核心难题。

jenkins8butler的博客 404

深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进

华为Limera激光雷达摄像头融合技术推动自动驾驶感知升级 华为推出的Limera创新性地将激光雷达与摄像头深度集成,采用共光路设计实现数据天然对齐,在小型障碍物识别等关键场景展现卓越性能。该产品代表了传感器前融合技术从分立走向共生的演进趋势,通过硬件级集成解决了多源异构数据融合难题。随着索尼堆叠式传感器等技术的出现,未来智能汽车感知系统将向高度集成的"超级传感器"方向发展,实现更精准的环境感知。Limera的发布标志着前融合技术从"可用"迈向"极致&quo

致力于lidar应用开发 395

python3 递归函数

一、递归的定义 1.什么是递归:在一个函数里在调用这个函数本身 2.最大递归层数做了一个限制:997,但是也可以自己限制 1 def foo(): 2 print(n) 3 n+=1 4 foo(n) 5 foo(1) 3.最大层数限制是python默认的,可以做修改,但是不建议你修改。(因为如果用997层递归都没有解决的问题要么是不适合使用递归来解决问题,要么就是你的代码太烂了) import sys sys.setrecursionlimit(10000000)#修改递归层数

nudepig 346

关于Sybase ASE数据库的license以及试用版过期的问题的解决方案

当用户从Sybase官网上下载了ASE15.0.2以后,如果选择了安装Express Edition或者Developer Edition,基本上不会碰到什么问题,除了有些功能受限以下。 但大多数可能选择了Enterprise Edition for Evaluation类型,即企业版试用。都会碰到这样的问题,即一个月以后,license过期,无法启动server。于是很郁闷,可能大部分人,会选...

iihero@优快云 790

python函数(3)—— 递归

是指在函数的定义中使用函数自身的方法它至少有一个明确的递归结束的条件(否则就是一个死循环),能给出递归终止的处理方法,每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少。通过以上六个例题,我们能发现运用递归思路能很容易解决比较难处理的问题。毕竟人无完人,递归也是有确定的,它不可能一直递归下去,并且当输入的值太大,递归次数太多时,python 都会报错。

weixin_68256171的博客 1106

使用C# HslCommunication库实现三菱PLC通信(含完整代码示例)

在工业自动化开发中,上位机与PLC的通信是关键环节。HslCommunication库是一个开源的.NET工业通信库,支持三菱、西门子、欧姆龙等多个品牌PLC的通信协议。本文将演示如何通过库实现C#程序与三菱PLC的通信,并提供完整的代码示例。

StevenChen的博客 2288

YOLOv11改进 | 集成FEM、FFM与SCAM即插即用模块:特征增强、融合与空间上下文建模新范式

FEM解决特征表达不足问题,增强关键特征响应FFM优化多尺度融合,提升小目标检测精度SCAM建模空间上下文,改善目标交互预测在保持YOLOv11实时性优势的同时,实现mAP+8.1%的显著提升,特别在复杂光照、密集目标、交互预测场景表现突出。其模块化设计使开发者可根据需求灵活组合,为各种复杂场景提供定制化解决方案。未来,随着跨模态扩展与神经架构搜索的深入,YOLOv11-FSC将进一步推动目标检测技术向更智能、更高效的方向发展。

走向CTO的路上... 988

Python 3 入门基础知识【3】递归函数以及参数部分

在编码过程中除了使用Python内置的函数以外,我们也经常需要自己定义函数。今天来回顾python中的函数。

weixin_43483590的博客 1253

用 OP-TEE 给 AI 模型“上锁”:密文存储、TEE 解密放行、推理后销毁(实战可落地)

本文提出一种基于OP-TEE的AI模型保护方案,通过两级密钥体系确保模型静态存储为密文,运行时仅在TEE内解密。方案采用KEK+DEK架构,DEK永不出TEE,支持分块解密与可验证擦除。该方案能有效防御静态分析、应用层逆向等威胁,但需承认其物理级攻击的局限性。文章详细描述了端到端架构、文件格式设计及TA实现要点,包括密钥管理、分块解密策略和销毁机制,为设备侧AI部署提供了工程可行的安全解决方案。

Interview_TC的博客 288

python算法三:递归法

递归法例题

qq_28782419的博客 1839

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python3之递归函数简单示例

概述 递归函数即直接或间接调用自身的函数,且递归过程中必须有一个明确的递归结束条件,称为递归出口。递归极其强大一点就是能够遍历任意的,不可预知的程序的结构,比如遍历复杂的嵌套列表。 递归求和 我们可以利用递归函数实现一个Python内置函数sum()的递归版。 # 递归 def d_sum(L): if not L: return 0 else: r...

weixin_34080903的博客 634

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python 3.x 学习 —— 递归函数

计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。 解决递归调用栈溢出的方法是通过尾递归优化。 尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次

jkdlzm的博客 2861

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python笔记——递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 1、举例 计算阶乘,用函数fact(n)表示,则: ,只有n=1时需要特殊处理。 于是,fact(n)用递归的方式写出来就是: def fact(n): if n==1: return 1 return fact(n-1)*n print(fact(5)) 120 ...

是金子总会发光 288

Python(3)递归函数 汉诺塔

汉诺塔: 有A,B,C三根柱子,在A柱子上从下往上按照大小顺序摞着n圆盘。把圆盘从小到大重新摆放在柱子C上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 1.该问题可以分解成三个部分:把除最下面的圆盘,即(n-1)个圆盘,从A移到B;把最下面的圆盘从A移到C;把其余(n-1)个圆盘移到C。(n=1时为特殊情况,只需要直接把A移到C) 2.其中第一步和第三步可以通过递...

lixiaoguai2017的博客 788

算法-手动推演八皇后问题-python3递归实现

0.摘要 本文介绍八皇后问题的解决思路,并使用python3实现。   1.问题阐述 目标: 8×8 的国际象棋棋盘上放置八个皇后 规则:任两个皇后都不能处于同一条横行、纵行或斜线上 显然可知: 由于任意皇后不能同行,所以每一行最多放置一位皇后; 由于行数=皇后数,所以每一行至少放置一位皇后 故:正确的放置方式,一定是每行有且只有一位皇后(1) 为了方便读者了解规则,我们先以4皇...

qq_17753903的博客 3626

python3的递归深度

def fact(n): if n==1: return 1 else: return n*fact(n-1) print(fact(998))如上代码是可以运行的,不过如果把998改成999就不行了,所以python3(windows64环境)下调用深度大概1000左右 可以通过手工设置深度来解决def fact(n): if n==1:

呵呵 1945

Python基础入门之函数三之递归函数

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #831100} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px 'Heiti SC Light'; min-height: 14.0px} p.p3 {margin: 0.0px 0.0p

hbblzjy的博客 1643

python3常用的三大函数之一map

lambda函数 add = lambda x, y : x+y print(add(1,2)) (1)map(func,seq[]) return list 对seq 中的item依次执政func(item),返回一个可迭代对象,需要用list/tuple将其接收 str = (‘a’, ‘b’,’c’, ‘d’) def fun2(s): return s + “.txt” ...

坏孩子 958

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程,

拔萝卜的码农 4万+

python学习笔记——递归与迭代详解

递归和迭代从本质上看都是循环的一种,递归通过在循环中调用自身,而迭代则通过某段代码实现循环 一、 递归: 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 注意: 递归就是在过程或函数里面调用自身; 在使用递归时,必须有一个明确的递归结束条件,称为递归出口 执行阶段:分解 ...

阿斯达克 3335

Python递归函数

python递归函数 #####此篇文章来源于我的老师Wayne,仅作记录以备复习 函数执行流程 def foo1(b,b1 =3): print('foo1 called',b,b1) def foo2(c): foo3(c) print('foo2 called',c) def foo3(d): print('foo3 called',d) def mai...

FatTigerx的博客 1024

python3 递归函数的理解

1.递归的定义 一个函数直接或者间接调用自己,那么这个函数就称为递归函数。 那这个函数如果一直自己调用自己,是不是会一直处于死循环状态,答案是不会,因为python为了杜绝此类现象,强制的将递归层数控制在了997层。 为了证实上面的说法,定义一个函数试试看 count = 0 def story(): global count count += 1 print(count) story() # story() '''结果: 调用第998层的时候就报错了 998Traceb

Python热爱者的博客 507
上一篇: Python3 学习笔记13_函数的参数_20180305
下一篇: Python3 学习笔记15_高级特性(切片+迭代)_20180306
metears
博客等级 码龄19年 15粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值