Python练习题 021:递归方法求阶乘
【Python练习题 021】 利用递归方法求5!。
----------------------------------------------
首先得弄清楚:5! 指的是“5的阶乘”,即 5! = 1*2*3*4*5。
然后呢,据说,“递归”就是对自身进行调用的函数。听着挺奇怪,反正先依葫芦画瓢,写代码如下:
def f(x):
if x == 0:
return 0
elif x == 1:
return 1
else:
return (x * f(x-1))
print(f(5))
大概意思是说:如果 x=5,那么就返回 5*f(4) 的值。而想知道这个值,就得先算出 f(4) 等于多少。根据函数 f(x),f(4) = 4*f(3),所以 f(5) = 5*4*f(3)。以此类推,推到 f(5) = 5*4*3*2*f(1)。函数 f(x) 说了,当 x==1 时,返回值为 1。所以:f(5) = 5*4*3*2*1 = 120。所以,输出结果如下:
120
听起来好像很麻烦,感觉不好理解。如果不用递归函数呢?用最基本的代码,可以写成:
f = 1
for i in range(1,6):
f = f * i
print(f)
结果一样是120。
都说递归函数代码简洁、逻辑清晰。就这题而言……有吗?
【2016-10-18 更新】-----------------------------------------
在【Python练习题 021:累积累加】这一题中学到了 functools.reduce() 和 lambda,甚是好用,用来算阶乘更是得心应手。试解本题如下:
import functools
print(functools.reduce(lambda x,y:x*y, range(1,6)))
看,2行就搞定了,真爽!关于 functools.reduce() 和 lambda,请参见【Python练习题 021:累积累加】。
而感谢 codegay,我不但又学了一种新解法,还学到了 operator.mul(a, b) 新技能!先看代码:
import functools, operator
print(functools.reduce(operator.mul, range(1,6)))
这种解法其实与前例使用 lambda 的思路是一样的,只不过利用 operator.mul(用于计算 a*b) 代替 functools.reduce() 所需的函数部分,却也十分简洁明了,赞!
++++++++++++++++++++++++++++++++++++++
Python练习题 021:递归方法求阶乘的更多相关文章
- Python练习题 028:求3*3矩阵对角线数字之和
[Python练习题 028] 求一个3*3矩阵对角线元素之和 ----------------------------------------------------- 这题解倒是解出来了,但总觉得 ...
- Python练习题 026:求100以内的素数
[Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...
- Python3练习题 021:递归方法求阶乘
利用递归方法求5!. 方法一 f = 1 for i in range(1,6): f = f * i print(f) 方法二 import functools print(functo ...
- Python练习题 024:求位数及逆序打印
[Python练习题 024] 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. ---------------------------------------------- ...
- Python练习题 019:求分数序列之和
[Python练习题 019] 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. --------------------------------- ...
- Python练习题 022:用递归函数反转字符串
[Python练习题 022] 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来. --------------------------------------- 又来一个递归题!不过,有 ...
- Python练习题 020:累积累加
[Python练习题 020] 求1+2!+3!+...+20!的和 -------------------------------------------------- 据说这题是"累积累 ...
- Python练习题 013:求解a+aa+aaa……
[Python练习题 013] 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入. 这题倒也 ...
- python基础练习题(题目 递归求阶乘)
day18 --------------------------------------------------------------- 实例026:利用递归方法求5! 分析:递归包括递归体和递归条 ...
随机推荐
- java的方法详解和总结
一.什么是方法 在日常生活中,我们所说的方法就是为了解决某件事情,而采取的解决办法 java中的方法可以理解为语句的集合,用来完成解决某件事情或实现某个功能的办法 方法的优点: 程序变得更加简短而清晰 ...
- Java中nextInt和nextLine同时使用出现的问题
代码: package com.ins1; import java.util.*; public class test { public static void main(String[] args) ...
- leetcode刷题-80.删除排序数组中的重复项 II
题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- Java高并发系列——检视阅读
Java高并发系列--检视阅读 参考 java高并发系列 liaoxuefeng Java教程 CompletableFuture AQS原理没讲,需要找资料补充. JUC中常见的集合原来没讲,比如C ...
- ui自动化--xpath
xpath //*代表从根节点,查找所有匹配到的元素.在filepath中输入后回车,会发现整个页面所有元素都被虚线选中 //表示跟节点 []代表要用属性定位 @表示要用什么属性 定位完成后,对应页面 ...
- JS -- DOM(文档对象模型)
认识DOM(文档对象模型) DOM(Document Object Model):定义访问和处理HTML文档的标准方法. DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). < ...
- [程序员代码面试指南]栈和队列-最大值减去最小值 小于或等于num 的子数组的数量(单调队列)
题目 给定数组arr和整数num,求数组的子数组中有多少个的满足"最大值减去最小值<=num". 解题思路 分析题目,有结论: 如果数组arr[i...j]满足条件,则它的每 ...
- python的运算符及数据类型的转换
python 目录 python 1.算术运算符 2.比较运算符 3.赋值运算符和复合赋值运算符 4.位运算符 5.逻辑运算符 6.成员运算符 7.身份运算符 8.常见的数据类型转换 1.算术运算符 ...
- Shell编程(4)
shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式 func() { #指定函数名 co ...
- TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要
在学C/C++ Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...