Python 如何编写递归函数来查找阶乘
一个数字的阶乘是从1到该数字的所有正整数的乘积。例如,4的阶乘是432*1 = 24。
为了使用递归的Python函数来查找一个数字的阶乘,我们可以定义一个函数,它以较小的输入调用自身,直到达到基本情况,即阶乘为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
这个迭代实现在处理非常大的输入时比递归实现有一些优势。首先,它没有遇到堆栈溢出问题,因为它不使用函数调用来计算阶乘。其次,它通常比递归实现更快,因为没有函数调用和堆栈操作的开销。然而,对于较小的输入,递归实现可能更简洁和易于理解。