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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C Primer Plus 第12章 12.6 分配内存:malloc()和free()

    C Primer Plus 第12章 12.6 分配内存:malloc()和free()

    2022年2月23日
    46
  • 4个Linux服务器监控工具

    4个Linux服务器监控工具4个Linux服务器监控工具转自http://blog.jobbole.com/58003/下面是我想呈现给你的4个强大的监控工具。htop–交互式进程查看器你可能知道在机器上查看实时进程的标准工具top。如果不知道,请运行$top看看,运行$mantop阅读帮助手册。htop是top的扩展版本,有更丰富的概貌(例如全命令、可视化、

    2022年6月1日
    42
  • 数模(6):Leslie矩阵人口模型

    数模(6):Leslie矩阵人口模型上期中介绍了两种利用非线性函数拟合人口与物种增长趋势的方法。这两种方法都可以用于对人口与物种增长的总体趋势进行预测,但预测不够精细。我们知道在正常社会条件或自然条件下,生育率与死亡率是与群体的年龄构成息息相关的。我们需要对整个群体按年龄进行层次划分,构建与年龄相联系的人口模型。典型的例子就是Leslie矩阵模型。Leslie矩阵介绍我们把整个社会中的人群按年龄等距分成n组,每组中该年的人口总数…

    2022年5月14日
    72
  • ssrf漏洞利用

    0x00前言发现最近已经很久没更新文章了,这里就先来更新一篇ssrf,这个漏洞也是最近才研究的,以前没有去挖过此类漏洞,对此漏洞的认知也比较少0x01漏洞原理这个漏洞产生是因为服务器向外部去

    2021年12月11日
    82
  • jenkins 邮件_邮件发送服务

    jenkins 邮件_邮件发送服务前言前面已经实现在jenkins上展示html的测试报告,接下来只差最后一步,把报告发给你的领导,展示你的劳动成果了。安装EmailExtensionPlugin插件jenkins首页-

    2022年7月29日
    9
  • spin_lock & mutex_lock的差别?

    spin_lock & mutex_lock的差别?

    2021年12月7日
    48

发表回复

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

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