如何用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日

562 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告