(小甲鱼python)函数笔记合集七 函数(IX)总结 函数的递归、递归和迭代的区别详解

news2025/1/12 6:05:49

一、基础复习

  1. 函数的基本用法 创建和调用函数 函数的形参与实参等等
  2. 函数的几种参数 位置参数、关键字参数、默认参数等
  3. 函数的收集参数*args **args 解包参数详解
  4. 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解
  5. 函数的闭包(工厂函数)
  6. lambda()函数表达式、map()、filter()函数详解
  7. 生成器的定义、使用和产生生成器的两种方法详解

二、递归

1.函数的递归
递归就是函数调用自身的过程。
例1.1:在funB()里面调用funA()。

>>> def funA():
	print("qsjoasj")

>>> def funB():
	funA()
	
>>> funB()
qsjoasj

例1.2:函数自身的调用,没有结束条件会一直循环下去。

>>> def funC():
	print("123asas")
	funC()

>>> funC()         # ctrl+c退出循环
123asas
123asas
123asas
123asas
123asas
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    funC()
  File "<pyshell#17>", line 3, in funC
    funC()
  File "<pyshell#17>", line 3, in funC
    funC()
  File "<pyshell#17>", line 3, in funC
    funC()
  [Previous line repeated 309 more times]
  File "<pyshell#17>", line 2, in funC
    print("123asas")
KeyboardInterrupt
>>> 

例1.3:加上一个条件递归语句,让递归在恰当的时候进行回归。
要让递归正常工作,必须要有一个结束条件,并且每次调用都会向着这个结束条件去推进。

>>> def funC(i):
	if i >0:
		print("AASDDWDA")
		i-=1
		funC(i)

>>> funC(10)  # 执行10次结束递归
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
AASDDWDA
>>> 

2.递归和迭代的对比
例2.1 求一个数的阶乘
方法一:迭代

>>> def factIter(n):
	result=n
	for i in range(1,n):
		result *= i
	return result

>>> factIter(5)
120
>>> factIter(10)
3628800
>>> 

方法二:递归
思路:定义一个递归函数,它的参数就是每次要运算的这个数值,然后接着让参数在每次调用的时候都递减一下,当检测到参数的值为1的时候就停止递归。

>>> def factRecur(n):
	if n==1:
		return 1
	else:
		return n * factRecur(n-1)

>>> factRecur(5)
120
>>> factRecur(10)
3628800
>>> 

例2.2 斐波那契数列
方法一:迭代

>>> def fibIter(n):
	a=1
	b=1
	c=1
	while n>2:
		c=a+b
		a=b
		b=c
		n-=1
	return c

>>> fibIter(12)
144
>>> fibIter(120)
5358359254990966640871840
>>> 

方法二:递归
递归会导致效率问题,每一次调用递归函数,它并不会立即返回,而是要等到最底层的那个函数返回,然后再一层一层往上走,这个过程及其耗费资源,比如代码中n=120的时候,代码会一直默认执行,此时只有ctrl+c结束任务。

>>> def fibRecur(n):
	if n==1 or n==2:
		return 1
	else:
		return fibRecur(n-1) + fibRecur(n-2)

	
>>> fibRecur(12)
144
>>> fibIter(120)  # 迭代次数n为120时,立即出结果。
5358359254990966640871840

>>> fibRecur(120) # 递归120次,代码会一直默认执行,此时只有ctrl+c结束任务。
Traceback (most recent call last):
  File "<pyshell#76>", line 1, in <module>
    fibRecur(120)
  File "<pyshell#73>", line 5, in fibRecur
    return fibRecur(n-1) + fibRecur(n-2)
  File "<pyshell#73>", line 5, in fibRecur
    return fibRecur(n-1) + fibRecur(n-2)
  File "<pyshell#73>", line 5, in fibRecur
    return fibRecur(n-1) + fibRecur(n-2)
  [Previous line repeated 108 more times]
KeyboardInterrupt

3.总结
执行同一个算法时,数字n较小时,迭代和递归效率相同,当数字n较大时,如例2.2迭代进行计算会更加方便。

课后题:
1.递归算法的实现原理什么?
答:函数调用自身。
解析:没错,就是这么简单,但一定要记得设定退出递归的条件,否则就会是有去无回。
2.实现同样的任务,说使用递归的执行效率通常要比迭代低,请问依据是什么?
答:函数重复调用导致的额外开销。
解析:递归效率低是由于函数的重复调用导致的额外开销。
3.请问下面代码中,recsum() 函数被调用了多少次?

>>> def recsum(x):
...     if x < 0:
...         return x
...     else:
...         return recsum(x-1) + recsum(x-2)
...        
>>> recsum(3)
-11

答:15 次。
解析:

recsum(3)
recsum(2) + recsum(1)
(recsum(1) + recsum(0)) + (recsum(0) + recsum(-1))
(recsum(0) + recsum(-1)) + (recsum(-1) + recsum(-2)) + (recsum(-1) + recsum(-2)) + (-1)
(recsum(-1) + recsum(-2)) + (-1) + (-1) + (-2) + (-1) + (-2) + (-1)
-1 - 2 - 1 - 1 - 2 - 1 - 2 - 1 = -11

4.下面代码利用递归实现将列表的各个元素进行相加,请补全红色方框中的代码,使其能够成功执行并获取结果。
在这里插入图片描述答:

>>> def recsum(x):
...     if not x:
...         return 0
...     else:
...         return x[0] + recsum(x[1:])

5.下面代码利用递归实现将嵌套列表的各个元素进行相加,请补全红色方框中的代码,使其能够成功执行并获取结果。
在这里插入图片描述答:

>>> def sumtree(x):
...     total = 0
...     for i in x:
...         if type(i) is not list:
...             total += i
...         else:
...             total += sumtree(i)
...     return total
...
>>> sumtree([1, 2, 3, [4, 5, [6, 7, 8, [9, 10]]]])
55

题目来自链接: 小甲鱼函数(VIII)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试题【有效子字符串】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明有效子…

如何使用New Bing的ChatGPT聊天机器人

New Bing是微软推出的一款基于GPT4模型的智能搜索引擎&#xff0c;可以提供更加人性化、交互式和多样化的搜索体验。在中国使用New Bing的ChatGPT聊天机器人需要以下几个步骤&#xff1a; 一、准备工作 1.1 申请微软邮箱 用来登录Edge浏览器和接收来自微软New Bing使用邀请的…

代码随想录算法训练营 || 贪心算法 435 763 56

Day31435. 无重叠区间力扣题目链接给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。示例 1:输入: [ [1,2], [2,3]…

TryHackMe-hackerNote

hackerNote 自定义 Web 应用程序&#xff0c;引入用户名枚举、自定义单词列表和基本权限提升漏洞。 端口扫描 循例 nmap Web 80和8080都是一样的页面&#xff0c;并且存在一个登录页面 除此之外还有另一个信息就是它只有一个用户 存在注册功能&#xff0c;我们注册一个用户…

AntDB数据库首个社区版正式发布,携手生态更多可能

3月1日&#xff0c;亚信科技AntDB数据库社区版正式开放免费下载。作为AntDB数据库的首个社区版产品&#xff0c;AntDB-CE&#xff08;Community Edition &#xff09; V7.2.0具有完整、易用、兼容度高的企业级分布式数据库产品特性&#xff0c;提供了详细的在线文档支持&#x…

Kafka基本原理

总述 简介 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各…

高清无线手机投屏电脑软件Airserver7全平台兼容

Airserver是一款优质的手机投屏软件&#xff0c;搭配了可调节的分辨率模式&#xff0c;针对不同的网络配置&#xff0c;还专门研发了低数据模式以及硬件加速功能&#xff0c;全方位保证投屏画面的清晰度。除此之外&#xff0c;通过调整画面的色彩变化&#xff0c;还可以增强用户…

OpenWrt介绍及编译基础教程

关于OpenWrt OpenWRT是一个高度模块化、高度自动化的嵌入式Linux系统&#xff0c;拥有强大的网络组件和扩展性&#xff0c;常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。 同时&#xff0c;它还提供了100多个已编译好的软件&#xff0c;而且数量还在…

SC12B触摸感应芯片评测方案(1)

MM32F0160SC12B Touch Application Evaluation 文章目录MM32F0160SC12B Touch Application EvaluationIntroduction & RequirementHardwareSC12B & SC12B Sample Demo boardMini-F0160 boardSoftwareMCU Software - MM32F0160PC Tool - FreeMASTERSummaryIntroduction …

Jupyter Lab | “丢下R,一起来快乐地糟蹋服务器!”

写作前面 工具永远只是为了帮助自己提升工作效率 —— 沃兹基硕得 所以说&#xff0c;为什么要使用jupyterlab呢&#xff1f;当然是因为基于服务器来处理数据就可以使劲造了&#xff0c;而且深切地感觉到&#xff0c;“R这玩意儿是人用的吗”。 jupyter-lab | mamba安装以及…

【微信小程序】-- 全局配置 -- window - 导航栏(十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Thymeleaf -- 视图模块

添加thymeleaf的jar包2. 新建一个Servlet类ViewBaseServletpublicclassViewBaseServletextendsHttpServlet { ​privateTemplateEnginetemplateEngine; ​Overridepublicvoidinit() throwsServletException { ​// 1.获取ServletContext对象ServletContextservletContextthis.g…

人大金仓和达梦的空间数据能力对比

一、总得来说&#xff1a; 人大金仓底层更解决于pg数据库&#xff0c; 人大金仓的空间能力基于postgis能力来实现&#xff0c;能力挺强大的. 细节上人大金仓的架构上也对空间的支持框架做的比达梦更加完善。例如数据库的集群能力&#xff0c;并行计算能力&#xff0c;空间数据…

使用热成像仪完成地暖检测应用

家庭地暖已逐步全面走进北方家庭中&#xff0c;常见的地暖系统分为两类&#xff0c;一类为电地暖&#xff0c;一类为水地暖&#xff0c;其常见问题为地暖发热不均&#xff0c;地暖不热或水暖管渗漏等问题。地暖系统在保障温暖及美观的同时&#xff0c;一直存在维修困难的问题&a…

最流行的自动化测试工具,总有一款适合你(附部分教程)

前言 在自动化测试领域&#xff0c;自动化工具的核心地位毋庸置疑。本文总结了最顶尖的自动化测试工具和框架&#xff0c;这些工具和框架可以帮助组织更好地定位自己&#xff0c;跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。 1&#xff09;Selenium …

第六章 图

文章目录前言知识框架数据结构的区分1. 图的基本概念1.1 图的定义1.2 图的基本概念和术语总结前言 参考文献&#xff1a;数据结构&#xff1a;图(Graph)【详解】 知识框架 数据结构的区分 线性表&#xff1a;数据元素之间是被串起来的&#xff0c;仅有线性关系&#xff0c;每…

Centos和Window系统下Frp内网穿透

frp 是一个高性能的内网穿透的反向代理软件&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等常见协议(TCP最常用)&#xff0c;可以将处于局域网或者家用电脑主机、办公电脑主机通过中转服务器的方式暴露在公网里&#xff0c;使用户可以通过访问公网的IP&#xff08;域名&#xff09;…

【数电基础】——触发器

目录 1.大纲 2.双稳态电路 3. SR锁存器&#xff08;或非门构成&#xff09; 4.SR锁存器&#xff08;与非门构成&#xff09; 5.门控SR锁存器&#xff08;与非门构成&#xff09; 6.触发器 1.D触发器 &#xff08;电平触发&#xff09; 2.D触发器&#xff08;上升沿触发&am…

腾讯会议演示者视图/演讲者视图

前言 使用腾讯会议共享PPT时&#xff0c;腾讯会议支持共享用户使用演示者视图/演讲者视图&#xff0c;而会议其他成员可以看到正常的放映视图。下面以Win10系统和Office为例&#xff0c;介绍使用步骤。值得一提的是&#xff0c;该方法同时适用于单显示屏和多显示屏。 腾讯会议…

详解JAVA注解

目录 1.基本注解 2.元注解 3.自定义注解 4.底层实现 1.基本注解 基本注解是JDK自带的一些单独使用的具有功能性的注解&#xff0c;包含以下四个&#xff1a; Override表示方法重写Deprecated表示方法过期&#xff0c;下个版本可能删除SuppressWarnings用于抑制告警SafeVa…