不管怎样,这是学习递归的一种糟糕的方法,因为你用它来做一些本质上不是递归的事情。如果你的老师真的要你写一个程序,让列表中的元素递归地递减,那就让他/她感到羞耻。在

正如Haidro所指出的,解决这个问题的最典型的方法就是使用列表理解来迭代列表[i - 1 for i in l]

作为一个循环,这是

^{pr2}$

如果您想在任意级别的深度解决相同的问题,递归是很有用的。例如,假设您有一个类似[1, [2, 3], [[4], 5]]的内容,并且您希望在维护列表结构的同时将每个数字递减1。在这种情况下,递归解决方案将在基本情况下使用迭代解决方案,在递归情况下调用自身。在def decr_recursive(l):

a = []

for i in l:

if isinstance(i, list):

a.append(decr_recursive(i))

else:

a.append(i - 1)

return a

如果您想支持的不仅仅是列表或整数,那么可以很容易地修改它。在>>> decr([1, [2, 3], [[4], 5]])

[0, [1, 2], [[3], 4]]

这是一类不使用递归很难解决的问题,但用它很容易解决。你要问的是那种不用递归就很容易解决的问题(看在上帝的份上,这只是一个列表上的简单迭代),但是用它来解决有点困难。在

在Python中避免递归的一些原因它更难阅读。比较[i - 1 for i in l],甚至显式循环,类似于def decr(l):

if not l:

return []

return [l[0] - 1] + decr(l[:1])

在Python中调用函数可能很昂贵。我在电脑上得到的时间和Ashwini Chaudhary差不多。但是在我的电脑上[i - 1 for i in range(10**4)]需要559微秒。这比最快的递归方法快三个数量级。

除非将递归限制设置得更高,否则递归函数在超过1000次调用后不起作用。您可能已经注意到Ashwini Chaudhary的答案中的sys.setrecursionlimit(10**5)调用。这是必要的,因为没有它,每次调用都会导致一个RuntimeError: maximum recursion depth exceeded的大回溯。但即使这样,一个稍微大一点的列表仍然会导致递归限制。根据documentation,每个操作系统都有一个上限,设置得太高会导致崩溃。

递归函数更难调试。它们不仅会因来自同一个函数的数百次调用而污染堆栈跟踪,而且在概念上更难理解,因为同一函数的同一部分以不同的方式使用,这取决于您所在的堆栈级别。人类自然的思维方式是反复的。我们一次只做一件事。我们自己大脑的“堆栈”只有几个层次,所以我们很难用递归的方式解决问题,比如“让我开始解决一个问题,但在我完成之前,让我解决另一个问题,然后当我完成时,我会完成原来的问题。在较小的问题中,我也会做同样的事情,这样我在写完之前就可以深入几层。”这就是为什么你走进厨房去拿笔,然后你看到一个糖果棒,开始吃它,当你吃完的时候,你就忘了笔了。你“递归”了一个层次,从笔问题到糖果条问题,你的心理堆栈变得太深了(只有两个层次,但这已经足够了)。如果你不是抓住了糖果棒,但是在你打开它开始吃之前,你还发现了笔(我能想出的最好的迭代分析),你可以做到这两个都不会忘记。你在程序中解决问题的方法应该和你在头脑中解决问题的方式完全相同,因为这是你理解代码在做什么的唯一方法。Python是一种非常好的语言,因为它的高级接口让您可以做到这一点(至少比低级语言更常见)。利用这个事实!

python将10到1递减_递归地将列表递减1相关推荐

  1. python递归函数例题_递归案例python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 而对应的中文翻译 "递归" 却表达了两个意思:"递 ...

  2. python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )

    创建数值列表 需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分.在数据可视化中,处理的几乎都是由数字(如温度.距离.人口数量.经度和纬度等)组成的 ...

  3. python主要学那个方向好_学好Python的10种方向,你选择好了吗?

    对于那些有着一定编程基础的人来说,学习Python会为你的技术锦上添花,而对于零基础的小白,很多人都不明白如何规划学习的方向,以下是小编规划的10种Python的学习方向,你们大可了解下: 1.Pyt ...

  4. Python 3.10来了!!!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 不用再自己琢磨如何实现 swi ...

  5. 刚刚,Python 3.10 正式发布了,我发现了一个可怕的功能..

    就在( 2021年10月4日) Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是 结构模式匹配 了吧?也就是大家所熟悉的 switch-case ,写错了不好 ...

  6. Python 3.10的几个好用的新特性

    来源:Deephub Imba本文约1200字,建议阅读5分钟 本文为你介绍Python 3.10新的有用的特性. 3.10版没有添加新的模块,但是引入了很多新的并且有用的特性.让我们来一起看看吧. ...

  7. python 3.10 新增 switch-case 简介

    目录 01 通用语法 02 在元组中运用 03 类(class) 04 if 子句模式 05 复杂模式和通配符 01 通用语法 Switch 语句存在于很多编程语言中,早在 2016 年,PEP 31 ...

  8. 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...

    就在2021年10月4日, Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是 结构模式匹配 了吧?也就是大家所熟悉的switch-case,写错了不好意思,是 ...

  9. Python 3.10刚发布,这5点非常值得学习!

    正值国庆节期间,Python官网发布了Python3.10.0. 说实话,对于这次的升级,有几个特性,还真是值得和大家讲讲. 1. 更友好的错误提示 Python 3.10以前,它是这样提示的,你可能 ...

最新文章

  1. mysql从库并发连接_MYSQL从库的并发恢复
  2. matlab怎么画单位圆的切线,matlab绘图曲线标注怎么输出角度单位,就是那个小圆圈?...
  3. 在C++中调用DLL中的函数
  4. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
  5. win7美化_Windows桌面管理美化,让桌面更加方便、高效
  6. 2018-05-16树莓派如何开启UART串口
  7. quartus仿真14:D触发器实现序列检测
  8. 【深入理解JVM】:Java对象的创建、内存布局、访问定位
  9. python 高性能http服务器_Python高性能HTTP客户端
  10. python json dumps 中文_Python下调用json.dumps中文显示问题解决办法
  11. python依赖包冲突
  12. 小白如何打造一个基础的留言板网站(一)
  13. 特写:美国B2C网站惨淡经营
  14. 已知某公众号的微信号怎样获取该公众号的二维码
  15. Shrinkage: I was in the pool
  16. ENVI软件使用与样本采集
  17. Git工作流应该如何选择
  18. mac brew 测速 软件_最好用的网络测速工具speedtest
  19. CSDN云IDE 初体验
  20. Python 去重csv文件中相同的重复行

热门文章

  1. javascript简易编辑器
  2. 计算机组成原理 复习笔记(已完结)
  3. pycharm211.7142.13 Win10下载、安装及汉化详细教程
  4. dy之__ac_signature
  5. 微商必死?揭秘那些江湖骗局!
  6. win10 头像的路径
  7. 赏析角度有哪些_【赏析句子的角度有哪些】作业帮
  8. GIT配置用户名邮箱
  9. HDOJ 2547 无剑无我(求两点距离)
  10. 模型交易平台产品介绍