Python 递归的多种写法

Python 递归的多种写法题目背景:让我们来看一些例子。要对一个数字列表(或者其他序列)求和,我们可以使用内置的sum函数,或者自己编写一个更加定制化的版本。这里是用递归编写的一个定制求和函数的示例defmysum(L): ifnotL: return0 else: returnL[0]+mysum(L[1:])这是一种最基本的递归写法,通过递归的方式将列表中的所有进行相加,典型的鸭子类型…

大家好,又见面了,我是你们的朋友全栈君。

题目背景:

让我们来看一些例子。要对一个数字列表(或者其他序列)求和,我们可以使用内置的sum函数,或者自己编写一个更加定制化的版本。这里是用递归编写的一个定制求和函数的示例

def mysum(L):
	if not L:
		return 0
	else:
		return L[0] + mysum(L[1:])

这是一种最基本的递归写法,通过递归的方式将列表中的所有进行相加,典型的鸭子类型。

编码替代方案:

有趣的是,我们也可以使用Python的三元if/else表达式。我们也可以针对任何可加和的类型一般化(如果我们至少假设输入中的一项的话,这将会变得较容易些,就像我们在第18章最小最大值的示例中所做的那样),并且使用Python 3.0的扩展序列赋值来使得第一个/其他的解包更简单:

def mysum(L):
	return 0 if not L else L[0] + mysum(L[1:]) # 使用三元表达式

def mysum(L):
	return L[0] if len(L) == 1 else L[0] + mysum(L[1:]) # 也是三元表达式,但是不适用[]

def musum(L):
	first, *rest = L
	return first if not rest else first + mysum(rest)	

后两者在一个单个字符串参数上也有效(例如,mysum (‘spam’)),因为字符串是一字符的字符串的序列;第三种变体在任意可迭代对象上都有效,包括打开的输入文件,但是,其他的两种不会有效,因为它们索引;并且函数头部def mysum(first, rest)尽管类似于第三种变体,但根本没法工作,因为它期待单个参数,而不是一个单独的可迭代对象。

处理非线性结构的方法

计算一个嵌套的字列表结构中所有数字的总和:

[1,[2,[3,4],5,6,[[7,8,[9]]]

解: 简单的循环语句在这里不起作用,因为这不是一个线性迭代。嵌套的循环语句也不够用,因为子列表可能嵌套到任意的深度并且以任意的形式嵌套。相反,下面的代码使用递归来对应这种一般性的嵌套,以便顺序访问子列表。

def sumtree(L):
	tot = 0
	for x in L:
		if not isinstance(x, list):
			tot += x
		else:
			tot += sumtree(x)
	return tot
""" print(sumtree(L)) [1, 2, [3, 4], 5, [6, 7, [8, 9]]] [3, 4] [6, 7, [8, 9]] [8, 9] 45 """
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149250.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项

    《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本文的目的则是向读者详细介绍MyBatis的一级缓存,深入源码,解析MyBatis一级缓存的实现原理,并且针对一级缓存的特点提出了在实际使用过程中应该注意的事项。读完本文,你将会学到:1、什么是一级缓存?为什么使用一级缓存?2、MyBatis的一级缓存是怎样组织的?(即SqlS

    2022年5月21日
  • 工程伦理复习笔记(全)

    工程伦理复习笔记(全)工程伦理第1-5章以及第10章笔记,附前五章问答题研究生考试系列—攻城伦理复习笔记—-弗兰大学参考教材:《工程伦理》清华大学第一章攻城与伦理第一章通过怒江水电开发的案例引出了工程伦理这一说法并且阐释了何为工程伦理。人类的工程实践不仅仅是一种改造自然的技术活动,也是一种关涉人丶自然与社会的伦理活动。第一章重点探讨了工程与伦理的概念,分析了工程实践中可能出现的各种伦理问题,提出处理工程实…

    2022年10月16日
  • 到底什么是“数据中台”,我用大白话给你说清楚

    到底什么是“数据中台”,我用大白话给你说清楚近几年以来,朋友圈、微博、技术论坛全网挂起了中台的热潮,下图是百度统计给出的趋势图。那么中台未来是会成为主流发展方向,还是昙花一现只是一个热门话题呢?我希望先从“中台”这个名词的来源开始,或许会有一个

    2022年6月30日
  • 使用cookie登录百度网盘(网站使用cookie)

    cookies2.txt为存放cookie字符串的文件。cookie字符串获取方式1.可以通过手动的方式去取,比如登录之后在console里面执行document.cookie即可获得2.在application里面查看cookie的值3.通过webdriver.Chrome(…)创建出来的实例,调用get_cookies()就可以获取到…

    2022年4月10日
  • 基尼系数直接计算法_基尼系数简单的计算方法

    基尼系数直接计算法_基尼系数简单的计算方法使用两种方法,通过python计算基尼系数。在sql中如何计算基尼系数,可以查看我的另一篇文章。两篇文章取数相同,可以结合去看。文章中方法1的代码来自于:(加入了一些注释,方便理解)。为精确计算。如果对于基尼系数概念不太清楚,可以看原文的第一部分。http://www.cnblogs.com/longwind09/p/8047539.html方法2和3借鉴资料:方法2和3…

    2022年10月13日
  • matlab在指定figure中画图_matlab保存fig为图片语句

    matlab在指定figure中画图_matlab保存fig为图片语句转载:http://www.ilovematlab.cn/thread-296430-1-1.html最近看了一些用matlab对图形图片进行保存的帖子和资源,关于图像保存的方法给大家分享一下这些方法是大家所使用方法的一个总结.如今常用的方法有三种printf,imwrite,saveas下面分别介绍一下:imwritemwrite将图像数据写成图像文件,一般用

    2022年9月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号