如何用Python递归函数求阶乘?


一个数的阶乘是所有从1到该数的所有正整数的乘积。例如,4的阶乘是4*3*2*1 = 24。

为了使用Python递归函数求一个数的阶乘,我们可以定义一个函数,该函数自身调用自身,并传入更小的输入,直到达到基本情况,即1的阶乘为1。

以下是使用Python递归函数求阶乘的代码:

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)

在这个代码中,函数`factorial(n)`接收一个数字`n`作为输入,并返回该数字的阶乘。第一个`if`语句检查输入数字`n`是否为1。如果`n`为1,则函数返回1作为基本情况。如果`n`不为1,则函数返回`n`和`n-1`的阶乘的乘积。这就是递归函数调用发生的地方,函数自身调用自身,输入为`n-1`。

要使用此函数,您可以简单地用您想要查找阶乘的数字调用它,如下所示:

示例

求8的阶乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(8))

输出

40320

示例

以下代码计算n = 6和n = 15的阶乘

def factorial(n):
   if n == 1:
      return 1
   else:
      res = n * factorial(n-1)
   return res
print ("factorial(6) = %d" %factorial(6))
print ("factorial(15) = %d" %factorial(15))

输出

factorial(6) = 720
factorial(15) = 1307674368000

这是一个代码运行的示例:

示例

def factorial(n):
   if n==0 or n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(5))

输出

120

为了理解函数是如何工作的,让我们看看它如何找到5的阶乘

函数被调用,输入为5。

由于5不等于1,因此执行`else`块。

函数返回5 * factorial(4)。

为了找到4的阶乘,函数再次被调用,输入为4。

由于4不等于1,因此执行`else`块。

函数返回4 * factorial(3)。

为了找到3的阶乘,函数再次被调用,输入为3。

由于3不等于1,因此执行`else`块。

函数返回3 * factorial(2)。

为了找到2的阶乘,函数再次被调用,输入为2。

由于2不等于1,因此执行`else`块。

函数返回2 * factorial(1)。

为了找到1的阶乘,函数再次被调用,输入为1。

由于1等于1,因此执行`if`块。

函数返回1作为基本情况。

之前的函数调用继续被解析。

2 * factorial(1) is resolved to 2 * 1 = 2.
3 * factorial(2) is resolved to 3 * 2 = 6.
4 * factorial(3) is resolved to 4 * 6 = 24.
5 * factorial(4) is resolved to 5 * 24 = 120.

最终结果120被返回。

这个过程展示了函数如何使用递归重复调用自身,传入更小的输入,直到达到基本情况1,然后通过将每个输入与其下一个较小输入的阶乘相乘来返回每个输入的阶乘。

以下是一些更多使用递归函数查找不同数字阶乘的示例:

示例

求7的阶乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(7))

输出

5040

示例

求10的阶乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(10))

输出

3628800

示例

求1的阶乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(1))

输出

1

示例

求0的阶乘(注意,0的阶乘定义为1)

def factorial(n):
   if n == 1 or n == 0:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(0))

输出

1

这些示例展示了如何使用该函数来查找不同数字的阶乘,包括0和1的边缘情况。

以下是一个更进一步的例子,说明该函数如何处理大型输入:

示例

求20的阶乘

def factorial(n):
   if n == 1:
      return 1
   else:
      return n * factorial(n-1)
print(factorial(20))

输出

2432902008176640000

此示例表明该函数可以处理大型输入,而不会出现错误或性能问题。但是,值得注意的是,对于非常大的输入,递归函数可能会遇到堆栈溢出问题,或者执行时间非常长,因此在这些情况下,最好使用阶乘函数的迭代实现。

以下是Python中阶乘函数的迭代实现:

def factorial(n):
   result = 1
   for i in range(1, n+1):
      result *= i
   return result

在此实现中,该函数迭代从1到n的所有数字,将它们相乘以计算阶乘。结果存储在变量`result`中,该变量初始化为1。

要使用此函数,您可以用您想要查找阶乘的数字调用它,如下所示:

示例

def factorial(n):
   result = 1
   for i in range(1, n+1):
      result *= i
   return result
print(factorial(9))

输出

362880

对于非常大的输入,此迭代实现比递归实现具有一些优势。首先,它不会遇到堆栈溢出问题,因为它不使用函数调用来计算阶乘。其次,它通常比递归实现更快,因为它没有函数调用和堆栈操作的开销。但是,对于较小的输入,递归实现可能更简洁且更容易理解。

更新于:2023年5月2日

浏览量:554

开启你的职业生涯

通过完成课程获得认证

开始学习
广告