【python学习】使用递归和循环两种方法实现:创建一个函数,传入一个参数n,返回n的阶乘。以及两种方法的区别

发布于:2024-07-15 ⋅ 阅读:(28) ⋅ 点赞:(0)

引言

需求:创建一个函数,传入一个参数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)))

代码解释

  1. from functools import reduce
    • 这行代码从functools模块中导入了reduce函数。reduce是一个高阶函数,它对序列中的元素进行累积操作,将它们两两组合,并使用提供的函数来减少序列到一个单一的值。
  2. n = 10
    • 这行代码定义了一个变量n,并将其赋值为10。这个变量代表了你想要计算阶乘的数字。
  3. 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。这是一个匿名函数,它接受两个参数xy,并返回它们的乘积。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,并打印这个结果。

三、递归和循环的区别

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:虽然递归和循环有这些区别,但最佳选择应基于具体的应用场景和性能需求


网站公告

今日签到

点亮在社区的每一天
去签到