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


相关推荐

  • linux挂马检测,检测网站挂马程序(Python)

    linux挂马检测,检测网站挂马程序(Python)系统管理员通常从svn/git中检索代码,部署站点后通常首先会生成该站点所有文件的MD5值,如果上线后网站页面内容被篡改(如挂马)等,可以比对之前生成MD5值快速查找去那些文件被更改,为了使系统管理员第一时间发现,可结合crontab或nagios等工具。程序测试如下:#pythoncheck_change.pyUsage:pythoncheck_change.pyupdate/hom…

    2022年9月30日
    0
  • Github教程_git安装及使用教程

    Github教程_git安装及使用教程https://www.cnblogs.com/xuxiaoxia/p/9482454.html1、首先要先在github的官网注册一个属于自己的账号。https://github.com/2、注

    2022年8月6日
    2
  • RT Thread FinSH组件

    RT Thread FinSH组件FinSH入口rt_components_init();voidmain_thread_entry(void*parameter){externintmain(void);#ifdefRT_USING_COMPONENTS_INIT/*RT-Threadcomponentsinitialization*/rt_components_init();#endif/*RT_USING_COMPONENTS_INIT*/#ifdefRT_US

    2022年5月21日
    38
  • Linux内核的整体架构

    Linux内核的整体架构1.前言本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。注:本文和其它的“Linux内核分析”文章都基于如下约定:  a)内核版本为Linux3.10.29(该版本是一个longterm的版本,会被Linux社区持续维

    2022年7月23日
    9
  • Centos 7配置LAMP「建议收藏」

    Centos 7配置LAMP「建议收藏」LAMP指的Linux(操作系统)、ApacheHTTP服务器,MySQL(有时也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建立web应用平台。所有组成产品均是开源软件,是国际上成熟的架构框架,很多流行的商业应用都是采取这个架构,和Java/J2EE架构相比,LAMP具有Web资源丰富、轻量、快速开发等特点,微软的.NET架构相比,LAMP…

    2022年5月3日
    88
  • mysql只有information_schema_validationquery not set

    mysql只有information_schema_validationquery not set在MySQL8.0以前,通常会通过infomation_schema的表来获取一些元数据,例如从tables表中获取表的下一个auto_increment值,从indexes表获取索引的相关信息等。但在MySQL8.0去查询这些信息的时候,出现了不准确的情况。例如auto_increment,–此时test表的auto_increment是204mysql>showcreate…

    2022年9月16日
    0

发表回复

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

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