引言
需求:创建一个函数,传入一个参数n,返回n的阶乘
文章目录
一、需求分析
需要用函数的形式返回n的阶乘
1.1 第一步,创建函数
def func3():
return
1.2 第二步,调用函数
print(func3(3))
二、代码实现
2.1 定义函数(循环)
第一种方法是循环
# 循环
def func3(n):
j = 1
for i in range(1, n+1):
j *= i
return j
2.2 定义函数(递归)
第二种方法是递归
# 递归
def func3(n):
if n == 0:
return 1
else:
return n * func3(n-1)
2.3 调用函数
print(func3(4))
2.4 不用函数实现(reduce方法)
# reduce函数
from functools import reduce
n = 10
print(reduce(lambda x, y: x * y, range(1, n+1)))
代码解释:
from functools import reduce
:- 这行代码从
functools
模块中导入了reduce
函数。reduce
是一个高阶函数,它对序列中的元素进行累积操作,将它们两两组合,并使用提供的函数来减少序列到一个单一的值。
- 这行代码从
n = 10
:- 这行代码定义了一个变量
n
,并将其赋值为10。这个变量代表了你想要计算阶乘的数字。
- 这行代码定义了一个变量
print(reduce(lambda x, y: x * y, range(1, n+1)))
:- 这行代码是计算并打印数字
n
的阶乘的关键部分。 reduce(lambda x, y: x * y, range(1, n+1))
:reduce
函数的第一个参数是一个lambda
函数,lambda x, y: x * y
。这是一个匿名函数,它接受两个参数x
和y
,并返回它们的乘积。reduce
函数会使用这个lambda
函数来累积序列中的元素。range(1, n+1)
生成了一个从1到n
(包含n
)的整数序列。在这个例子中,因为n
是10,所以这个序列是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。
reduce
的工作方式如下:- 首先,取序列的前两个元素(1和2),使用
lambda
函数计算它们的乘积,得到2。 - 然后,将上一步的结果(2)与序列的下一个元素(3)相乘,得到6。
- 这个过程继续进行,每次将上一次的乘积结果与序列中的下一个元素相乘,直到处理完整个序列。
最终,reduce
函数返回序列中所有数字的乘积,即n
的阶乘。所以,当n
是10时,这段代码会计算10!
(10的阶乘),其结果是3628800
,并打印这个结果。
- 首先,取序列的前两个元素(1和2),使用
- 这行代码是计算并打印数字
三、递归和循环的区别
3.1 递归:
3.1.1 可读性
递归代码通常更简洁,易于理解,尤其是对于某些问题(如分治算法、树遍历等)
3.1.2 内存使用
递归可能会占用更多的内存,因为每次函数调用都需要在调用栈上保存信息。对于深度很大的递归,可能会导致栈溢出。
3.1.3 性能
递归可能比循环慢,因为它涉及额外的函数调用开销。
3.2 循环:
3.2.1 可读性
对于某些问题,循环可能比递归更难理解,尤其是当循环逻辑复杂时
3.2.2 内存使用
循环通常比递归更节省内存,因为它们不需要额外的栈空间
3.2.3 性能
循环通常比递归快,因为它们避免了函数调用的开销
总而言之,如果性能是关键考虑因素,通常建议使用循环;如果代码的可读性和维护性更重要,递归是更好的选择。
PS:在Python中,由于全局解释器锁(GIL)的存在,递归可能会导致性能瓶颈,因此循环通常更受推荐
四、总结
4.1 循环的逻辑示意图
4.2 递归的逻辑示意图
PS:虽然递归和循环有这些区别,但最佳选择应基于具体的应用场景和性能需求