Python练习题 020:累积累加
【Python练习题 020】 求1+2!+3!+...+20!的和
--------------------------------------------------
据说这题是“累积累加”的问题,把“1+2!+3!+...+20!”展开就变成:
1
1*2
1*2*3
1*2*3*4
……
1*2*3*4……*20
弄懂了这规律,问题就好解决了。代码如下:
sum = 0
x = 1
for i in range(1,21):
x = x * i
sum = sum + x
print(sum)
输出结果如下:
2561327494111820313
【2016-10-18 更新】------------------------------------------------
感谢 rm-rf 的指教,用递归、lambda、functools.reduce() 这三把斧头为我们提供了新思路。不过,新知识太多了,一时我接受不了,还是一样一样来吧。
先不管递归,我们来看看使用了 lambda 和 functools.reduce() 的代码吧:
import functools sum = 0
for i in range(1,21):
sum = sum + functools.reduce(lambda x,y: x*y, range(1, i+1))
print(sum)
根据网上的资料,上述代码中,lambda x,y: x*y 的意思是:有一个函数,接受x, y两个参数做乘法。也就是说,把函数压缩到1行,真是很简洁。
而 functools.reduce() 也很神奇,大概结构是 functools.reduce(函数, 序列, 初始参数),其中括号里的函数需要2个参数,如果没有指定初始参数,就先从序列中拿出2个传递给函数,之后把结果作为第1个参数,再从序列中拿出第3个项目作为第2个参数一起传递给函数,如此循环至序列空空为止。如果指定初始参数,则这个初始参数作为第1个参数,然后从序列中拿出1个作为第2个参数,传递给函数。请参见官方文档。
上述代码中,functools.reduce(lambda x,y: x*y, range(1,i+1)) 意思就是说:先从 range(1,i+1) 拿出2个元素,作为参数传递给乘法函数 lambda x,y: x*y,计算出的结果摇身变成参数,再从 range(1, i+1) 拿出1个元素,两个配一起传递给函数重新计算。假如是 range(1, 4),这个函数就会计算 (1*2)*3。
有了以上做铺垫,外面再套个 for 从1循环到20,就能得出题解。
弄明白 lambda 和 functools.reduce() 之后,就可以用递归来解决这道题了。
所谓“递归”,就是在函数体中调用自身。也就是说,在函数的计算式里,有一个元素是需要另外拿出来,放进这个函数里进行计算的,而在计算这个元素时,可能又有一个元素还得拿出来单独再计算,直到所有元素都不符合条件,循环也就结束了。
就像本题,倒着写就成了 20! + 19! + 18! + ... + 3! + 2! + 1。如果每个阶乘 n! 都写成 f(n),计算 f(n) 时需要先知道 f(n-1) 的结果,而计算 f(n-1) 时同样又需要先计算 f(n-2) 的值,如此循环,直至 n == 1,递归结束 …… 我觉得我根本讲不清楚!!不管了,上代码:
import functools def f(n):
if n == 1:
return 1
else:
return functools.reduce(lambda x,y: x*y, range(1, n+1)) + f(n-1)
print(f(20))
唉,其实还是蛮难理解的。多做点练习,也许能逐渐掌握吧……
++++++++++++++++++++++++++++++++++++++
Python练习题 020:累积累加的更多相关文章
- Python练习题 021:递归方法求阶乘
[Python练习题 021] 利用递归方法求5!. ---------------------------------------------- 首先得弄清楚:5! 指的是"5的阶乘&qu ...
- Python练习题 004:判断某日期是该年的第几天
[Python练习题 004]输入某年某月某日,判断这一天是这一年的第几天? ---------------------------------------------- 这题竟然写了 28 行代码! ...
- Python练习题-1.使用匿名函数对1~1000求和,代码力求简洁。
Python 练习 标签(空格分隔): Python Python练习题 Python知识点 一.使用匿名函数对1~1000求和,代码力求简洁. 答案: In [1]: from functools ...
- Python练习题 002:奖金计算
[Python练习题 002]企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成 ...
- Python练习题 028:求3*3矩阵对角线数字之和
[Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...
- Python练习题 027:对10个数字进行排序
[Python练习题 027] 对10个数字进行排序 --------------------------------------------- 这题没什么好说的,用 str.split(' ') 获 ...
- Python练习题 026:求100以内的素数
[Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...
- Python练习题 025:判断回文数
[Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. ---------------------------------------- ...
- Python练习题 024:求位数及逆序打印
[Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- ...
随机推荐
- .net core 3.0 web api 重点设置,主要为了解决axios post不到参数问题
这两天研究.net core 3.0升级,前端vue+axios 后端web api.测试过程中发现post的时候,由于提交的是json对象,后端web api获取不到数据. 今天贴了下解决过程.主要 ...
- 符合SEO的网站标题应该怎么写
http://www.wocaoseo.com/thread-96-1-1.html 的seo网站标题既能提起读者的点击欲望,又能搜索引擎中获得好的排名,这两着之间有着有有一些联系,网站的标题若要从s ...
- include标签—引用文件路径
今天给大家讲解的是include标签,在打代码的时候总会出现一些重复的样式,这个时候就可以用include标签来减少打代码的次数. 文件名index.html,代码: {% from 'macros/ ...
- 力扣Leetcode 1518. 换酒问题
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒.你购入了 numBottles 瓶酒. 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的. 请你计算 最多 能喝到多少瓶酒. 示例: ...
- 详细分析链表的数据结构的实现过程(Java 实现)
目录 链表的数据结构的实现过程(Java 实现) 前言 基本概念 链表的基本结构 链表的基本操作的实现 在链表中添加元素 在链表头添加元素 在链表指定位置处添加元素 链表的虚拟头节点 链表的查询和修改 ...
- [ASP.NET Core开发实战]基础篇03 中间件
什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...
- PHP使用FilesystemIterator迭代器遍历目录
/** * PHP高效遍历文件夹(大量文件不会卡死) * @param string $path 目录路径 * @param integer $level 目录深度 */ function f ...
- Chrome开发者工具调试详解
chrome开发者工具最常用的四个功能模块:元素(ELements).控制台(Console).源代码(Sources),网络(Network). 元素(Elements):用于查看或修改HTML元素 ...
- 攻防世界——web新手练习区解题总结<2>(5-8题)
第五题cookie: 所需工具:burpsuite(需自行下载) 老规矩看完题,先获取在线场景,得到如下网页 那么什么是cookie呢?大体上就是网站为了识别用户身份而储存在用户本地终端上的数据,类型 ...
- c# 可获取系统环境
c# 可获取系统环境, 启动进程执等 *.shell [MenuItem("Tools/DesignHelper/Clean and Pull")] private sta ...