第5.5节 函数递归、嵌套及样例

头歌C语言递归函数、嵌套函数 ###编程要求 请仔细阅读右侧代码,结合相关知识,在。题目描述:编写一函数实现下列Ackman函数,其中。因阶乘结果变化很快,所以输入数据不可太大。题目描述:编写一个递归函数,将一个整数。,每个数字后面接一个空格用于隔开字符。请仔细阅读右侧代码,结合相关知识,在。请仔细阅读右侧代码,结合相关知识,在。请仔细阅读右侧代码,结合相关知识,在。相应的用空格隔开的数字字符。输出表达式的值,占一行。输出表达式的值,占一行。区域内进行代码补充。区域内进行代码补充。区域内进行代码补充。区域内进行代码补充。 阅读详情

一、    函数递归及嵌套简介
1.    函数支持递归,递归就是函数可以在函数内调用自己,这种情况在C语言等语言就已经支持,不单独介绍;
2.    Python支持函数内再定义函数,这种方式称为函数嵌套。函数内的函数称为局部函数,其上层函数称为封闭函数:
1)    在默认情况下,局部函数对外部是隐藏的,局部函数只能在其封闭函数内有效;
2)    封闭函数也可以返回局部函数,以便程序在其他作用域中使用局部函数,此时返回的函数在调用方使用时就可以等同于普通函数一样使用;
3)    在局部函数中如果需要访问封闭函数的变量,需要使用nonlocal进行声明;
4)    局部函数大多数情况下可以与封闭函数使用两个函数实现,但局部函数在某些特定场景下使用可以简化程序的实现方式。相关内容在后面章节再介绍。
  
二、    函数其他的知识
1.    要判断某个对象是否为函数可调用,可使用内置函数callable,该函数参数为需要判断的对象如函数名,返回值为布尔值,为True就表示可调用;
2.    所有函数都是 function 对象,这意味着可以把函数本身赋值给变量,就像把整数、浮点数、列表、元组赋值给变量一样。举例:

>>> def f(n1,n2,*n):
    print('n1=',n1,',n2=',n2,',numbers=',n)
>>> add=f
>>>type(add)  #结果为:<class 'function'>


3.    可将函数作为其他函数的形参,通过使用函数作为参数可以在调用函数时动态传入函数,实际上就可动态改变被调用函数的部分代码;
4.    Python 还支持使用函数作为其他函数的返回值;
5.    如果函数需要有多个返回值,则既可将多个值包装成容器的元素如列表之后返回,也可直接返回多个值。如果 函数直接返回多个值,Python 会自动将多个返回值封装成元组。六、    案例
1.    实现完整的可变参数的计算函数
该函数输入一串至少2个数字的不限数量的数字,然后调用对应的运算符进行连续运算(如连加、连减、连乘等),如:cal(‘+’,1,2,3) 、cal(‘*’,1,2,3,4)结果为24。不多说,直接上代码:

\>>> def cal2var(number1,number2,calmethod): #实现2个数的运算,第三个参数为运算符
    if calmethod=='+':return  number1+number2;
    elif  calmethod=='-':return  number1-number2;
    elif  calmethod=='*':return  number1*number2;
    elif  calmethod=='/':return  number1/number2;
    else: raise ValueError('运算符必须是+-*/中的一个')
\>>> def cal(number1,number2,*numbers,calmethod='+'):
 #实现n个数的运算,第1个和第2个参数必须有且是整数,后面还可以跟随不限量的多个整数,最后一个参数为运算符
   print('number1=',number1,',number2=',number2,',numbers=',numbers,', calmethod=',calmethod) 
   calmethod=calmethod.strip() #去掉运算符前后的空格
   if len(calmethod)!=1: raise ValueError('运算符长度必须为1个字符') 
   if '+-*/'.find(calmethod)==-1 :raise ValueError('运算符必须是+-*/中的一个') 
   if not isinstance(number1,int): raise TypeError('第1个参数必须为整数') 
   if not isinstance(number2,int): raise TypeError('第2个参数必须为整数') 
   result=cal2var(number1,number2,calmethod)
   for i,n in enumerate(numbers): #注意使用了enumerate函数,请参见前面的章节《几个与迭代相关的函数》内容
       if  isinstance(n,int): #判断n是否为整数
           result=cal2var(result,n,calmethod)
       else:raise TypeError('第'+str(i+3)+'个参数必须为整数') 
   return result

\>>> cal(1,2,3,4,5,6)
number1= 1 ,number2= 2 ,numbers= (3, 4, 5, 6) , calmethod= +
21
>>> cal(1,2,3,4,5,6,'*') #调用方式对吗?看结果
number1= 1 ,number2= 2 ,numbers= (3, 4, 5, 6, '*') , calmethod= +
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    cal(1,2,3,4,5,6,'*') #调用方式对吗?看结果
  File "<pyshell#3>", line 12, in cal
    else:raise TypeError('第'+str(i+3)+'个参数必须为整数')
TypeError: 第7个参数必须为整数
\>>> cal(1,2,3,4,5,6,calmethod='*')
number1= 1 ,number2= 2 ,numbers= (3, 4, 5, 6) , calmethod= *
720
\>>> cal(1,2,3,4,5,6,7)
number1= 1 ,number2= 2 ,numbers= (3, 4, 5, 6, 7) , calmethod= +
28


    说明:
1)    上述实现先定义了函数cal2var,实现两个数的运算,因为cal函数中需要先实现第一个和第二个参数的运算,后面才是可变个数的参数参与运算,为了简化代码,就定义了cal2var,该函数的定义可以直接放到函数cal函数中作为局部函数,使用效果是相同的;
2)    看了cal函数的第一个print语句的输出就知道收集参数怎么使用;
3)    cal函数的calmethod有缺省值,因此放在最后,如果不使用缺省值,就可以放在第一个,这样后面调用时就不用关键字参数方式调用,本例特地这样使用,实际上由于收集参数后面必须是关键字参数的形式,因此这个缺省值没有用,主要是为了演示收集参数的实参和形参匹配过程;
4)    这个函数其实结合后面章节的动态执行方法有个更简单的实现方式,到时再演示。

2.    使用递归函数和局部函数再次实现上述案例

def cal(number1,number2,*numbers,calmethod='+'): 
#实现n个数的运算,第1个和第2个参数必须有且是整数,
#后面还可以跟随不限量的多个整数,最后一个参数为运算符
   def cal2var(number1,number2,calmethod): #局部函数实现2个数的运算,第三个参数为运算符
       if calmethod=='+':return  number1+number2;
       elif  calmethod=='-':return  number1-number2;
       elif  calmethod=='*':return  number1*number2;
       elif  calmethod=='/':return  number1/number2;
       else: raise ValueError('运算符必须是+-*/中的一个') 
   #由于递归调用传递参数时,将收集参数的数据(此时保存在元组内)作为参数传递,
   #导致实际numbers可能是包含一个元组元素的元组,因此需要将这种情况的元素去掉一层元组
   if len(numbers)==1:numbers=numbers[0]    
   print('number1=',number1,',number2=',number2,',numbers=',numbers,'(len=',len(numbers),'), calmethod=',calmethod) 
   calmethod=calmethod.strip() #去掉运算符前后的空格
   if len(calmethod)!=1: raise ValueError('运算符长度必须为1个字符') 
   if '+-*/'.find(calmethod)==-1 :raise ValueError('运算符必须是+-*/中的一个') 
   if not isinstance(number1,int): raise TypeError('第1个参数必须为整数') 
   if not isinstance(number2,int): raise TypeError('第2个参数必须为整数') 
   result = cal2var(number1,number2,calmethod) 
   if not len(numbers): return result
   ops=list(numbers)
   number=ops.pop(0)
   return cal(result,number,tuple(ops),calmethod='+')  
   return result


执行截图:
 
本节详细介绍了函数函数递归、函数嵌套以及函数的作用域相关内容,并进行了计算函数的实现。
老猿Python(https://blog.youkuaiyun.com/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!

NVIDIA A100驱动及CUDA安装指南 NVIDIA A100驱动及CUDA安装指南:详细介绍了在Ubuntu系统下安装A100显卡驱动和CUDA工具包的完整流程,包括环境准备、驱动安装、CUDA配置及性能优化建议。特别推荐猿界算力平台提供开箱即用的A100算力租赁服务,具备专业团队支持、灵活租期和实惠价格等优势。文末通过PyTorch测试验证了A100设备的可用性,展示了80GB显存的强大计算能力。 阅读详情

相关推荐

【Labview】对连续采集数据的一种采样方法

图1如图1,想要对这样一个连续信号进行数据点的采集,我根据网上收集到的方法,在此分享一下最终的结果。可以拓展结合文件的写入,完成对连续信号的采集和输出。 已知: 一个连续信号,如图1. 目标: 设定一定采集点个数、采集点时间间隔、和采集周期次数,得到这条连续信号的数据点,如图2. 图2 方法如下: 主要利用的是队列的方法。 在连续信号生成的时候,不断的写入队列,并且清除队列。 ...

李时珍食疗志的博客 1万+

函数的总结:递归与嵌套,递归思想,递归综合症?

本次内容是本人反复敲,反复出错后的经验贴,希望对还没遇到问题的有个提示作用,对有问题的能帮助到大家,程序猿的世界是奇妙的,需要不断去实践,才能出真知。

久谦的博客 2331

K-L展开 (Karhunen-Loeve expansion)

K-L变换

susan_wang1的博客 2万+

递归之谜:解析无限嵌套的美

嵌套是指在一个事物中包含另一个事物,而递归是一种特殊形式的嵌套,其中一个事物包含自身。

子夜的个人博客 2050

Origin软件XRD全峰拟合保姆级教程:从数据导入到弱峰处理技巧

本文提供了一份Origin软件进行XRD全峰拟合的深度实战指南。文章重点解析了从数据导入预处理、基线锚点视觉化设置,到弱峰拟合的锁定策略与手动干预等核心技巧,旨在帮助用户避开常见错误,获得可靠、精确的拟合结果,从而有效服务于材料结构分析。

rgv2345678的博客 706

18、偏微分方程数值计算:粘性不可压缩流与电磁学的有限元方法

本文系统介绍了偏微分方程数值计算在粘性不可压缩流与电磁学中的应用,重点探讨了稳态与非稳态Navier-Stokes问题的混合有限元方法及求解技术,包括弱形式构建、半离散与时间离散格式、牛顿迭代法等。同时,详细阐述了电磁学中Maxwell方程的有限元与时域有限差分法(FDTD)求解方法,涵盖时间谐波与时域波方程、边界条件处理、稳定性分析与误差估计。结合MATLAB代码示例和实际案例,展示了速度场、压力、电场与磁场的数值模拟过程,并通过流程图与表格对比了两类问题的方法原理、应用场景与收敛性特性。最后展望了多物理

lemon的博客 87

Python函数的应用——嵌套与递归

一、嵌套: 1.对嵌套的理解(定义): 允许在一个循环体里面嵌入另一个循环 2.语法(分为for循环嵌套语法与while循环嵌套语法): 1.Python for 循环嵌套语法: 2.Python while 循环嵌套语法: 3.小Tips: 在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环,反之,你可以在for循环中嵌入while循环。 二、递归: 1.对递归的理解(定义): 在循环体内嵌入其他的循环体,如在while循环中可以嵌入for循环,反...

SmallD1018的博客 2595

高通MBIM拨号流程简述

高通平台MBIM流程简述

不秃头的程序猿Gabriel的博客 5070

c语言函数总结(嵌套 递归)

c语言函数的简单应用(嵌套、递归)总结

寄蜉蝣于天地,渺沧海之一粟 3119

[Python + UG NX 二次开发新手教程] 第五课 采用Python / UF 开发模式

在 NX 二次开发里看到的“UF”是的缩写,它是 Siemens 提供的集合,也是整个 NX Open 体系里最贴近内核、历史最悠久的一套接口。相当于 NX 的“系统调用”——只要 NX 能做的事,UF 几乎都能调得动。Siemens 从 NX 12 开始把原来的 C 接口(UF)全部打包进了官方 Python 模块,命名空间为 NXOpen.UF.*,所以只要 NX 安装目录里带了 NXOpen\UF 子模块,就能在 Python 里直接调用 UF 函数。

温良 1004

华为OD机考双机位C卷 - 敌情监控 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 敌情监控 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 964

函数的嵌套调用和递归调用

1.嵌套调用 如果函数1调用了函数2,函数2再调用了函数3,便形成了函数的嵌套调用。 例如: #include &amp;lt;iostream&amp;gt; using namespace std; int fun2(int m) { return m*m; } int fun1(int x,int y) { return fun2(x)+fun2(y); } int main(){ ...

elinice 7164

【PCL点云配准】位姿估计

本文介绍了PCL(Point Cloud Library)中TransformationEstimation模块的核心算法原理和实现方法。该模块通过多种子类(如SVD、LM、双四元数等)提供点云配准功能,支持2D/3D刚性变换估计。主要内容包括:1)各类变换估计算法的数学原理和实现细节;2)点对点/点对面两种误差度量方法;3)线性闭式解和非线性迭代两种求解方式;4)变换验证机制;5)基于三点法的完整代码示例。该模块广泛应用于SLAM、三维重建等领域,为点云配准提供了高效可靠的解决方案。

yijiujiusan的博客 241

【C语言】函数嵌套的调用 函数递归调用

函数嵌套的调用 函数递归调用

m0_73189710的博客 6752

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++函数二(函数的嵌套调用和递归调用)

函数的嵌套调用 C++不允许对函数作嵌套定义,也就是说在一个函数中不能完整地包含另一个函数。在一个程序中每一个函数的定义都是互相平行和独立的。虽然C++不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数 所谓嵌套调用,是在调用一个函数并执行该函数的过程中,又调用另一个函数的情况。如在main()函数中调用了a函数,而在a函数的执行过程中又调用b函数。这就构成...

CX的博客 6288

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

4.6 函数的嵌套调用和递归调用

但是,用递归方法编写的程序执行起来在时间和空间的开销上比较大,既要花费较长的计算时间,又要占用较多的内存单元,因为递归的过程中要占用较多的内存单元存放“递推”的中间结果。在调用B函数的过程中,还可以调用C函数。原有的问题能够分解为一个新的问题,而新的问题又用到了原有问题的解法,这就出现了递归。按照这一原则分解下去,每次出现的新问题是原问题简化后的子问题,而最终分解出来的新问题是一个已知解的问题。该阶段是从已知的条件出发,按照“递推”的逆过程,逐一求值回归,最后到达递推的开始处,结束回归阶段,完成递归调用。

tang7mj的博客 1210

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

函数的嵌套调用与递归(初学者)

1、函数的嵌套调用 嵌套定义是在定义一个函数时,其函数体内又包含另一个函数的完整定义。 然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。 例: main() {   a(); } a() {   b(); } b() {   return; } 例题:计算s=2²!+3²! 思路:(1)可编写两个函数...

qq_44137560的博客 3039

第5部分 递归函数、嵌套函数

第1关:递归求阶乘数列 任务描述 题目描述:用递归求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。 相关知识(略) 编程要求 请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。 输入 一个整数n(1<=n<=20) 输出 输出表达式的值,占一行。 测试说明 样例输入: 5 样例输出: 153 提示: 因阶乘结果变化很快,所以输入数据不可太大。 参考答案: #include<stdio.h> long long solve(long lon

Lixunzhe0112的博客 4974

Javascript 嵌套函数 - 递归函数 - 内置函数详解

在了解了函数的定义和函数调用外,下面我们来介绍一下JavaScript中几种特殊的函数。下面详细给大家讲解一下这3中函数调用方式。

licun110的博客 1936

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

pass@decoratorpass其中,decorator 为装饰器。@decorator 为函数的装饰器修饰符。func 为装饰器的函数对象参数。装饰器可以返回一个值,也可以返回一个函数,还可以返回一个装饰器或其他对象。例如:装饰器返回一个值return 3print(result) # 输出 4代码解析:当调用时,实际上我们是在用装饰器,而替代了func装饰器中嵌套了wrapper()函数,并且返回值是wrapper,所以实际上我们就是调用了wrapper()

cilmy23的note 1737

Python 嵌套函数

在 Python 中,函数的用法可谓是千变万化,只不过我们平日接触的大多是一些基本用法。函数强大之处当然不止于此,它还有很多高级用法 - 闭包、装饰器。

青春不老,奋斗不止! 4万+

C语言--函数的嵌套与递归调用(函数内容二)

*实现函数的嵌套与递归调用*,求几个数中的最大值以及相加和 函数的嵌套与递归其实很容易区分,嵌套很容易理解,递归难度更大一些,接下来组合看这两个概念: 函数的嵌套:在调用一个函数的过程中,又调用另一个函数。这就是函数的嵌套。注意,是调用另一个函数。 图解如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/1a52f9c473544883a897fefcc72e0ac3.png?x-oss-process=image/watermark,type_d3F5LXplbmhl

qq_53174498的博客 3939

python函数中递归和嵌套函数

函数递归:函数调用自身就会成递归 因为函数自身会调用自身,所以会形成死循环,因此递归必须要有终止条件 python等若数据类型语言一般会规定不能超过1000次

2302_77035737的博客 521

11.函数(C语言)+递归函数(超清晰图解递归)

函数1.函数是什么?2.库函数1)库函数的基本知识2)初识几个库函数3.自定义函数自定义函数的组成4.函数参数1 )实际参数(实参):2) 形式参数(形参):5.函数调用1) 传值调用2)传址调用3)练习1. 写一个函数可以判断一个数是不是素数2. 写一个函数判断一年是不是闰年。3. 写一个函数,实现一个整形有序数组的二分查找4. 写一个函数,每调用一次这个函数,就会将num的值增加16.函数的嵌套调用和链式访问7.函数的声明和定义8.函数递归 1.函数是什么? 1)函数是一个大型程序中的某部分代码, 由一

qq_52276036的博客 6357

C语言的库函数、自定义函数、嵌套函数,以及递归函数

函数是C语言和C++很重要的部分,从它们本身有的系统的库函数,到我们自定义类型的函数。我们需要了解进一步地了解它们,掌握它们,使用它们。让我们一起学习,一起探索,一起实现C/C++的这块重要的语言知识吧!!!

Williamtym的博客 1505
上一篇: 第5.4节 Python函数中的变量及作用域
下一篇: 第6章 Python中的动态可执行方法 第6.1节 Python代码编译
LaoYuanPython
LaoYuanPython 2020年博客之星Top3 2020年博客之星Top3 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄8年 15万+粉丝 1324原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值