1.用循环的方法实现:
num = int(input())
factorial = 1 # 1
for i in range(1,num + 1): # 2
factorial *= i # 3
print(factorial)
1.1 这是初始化阶乘,这里的factorial
没有实际含义,只是一个变量名
1.2 循环,左闭右开,所以右边的num+1
实际上是值循环到num
1.3 factorial *= i
拆分开来是factorial = factorial * 1
,相当于每次循环都把i乘一下factorial
并再次赋值给factorial
,最终结果是 一个1 * 2 * 3 * 4 ...
的循序一直乘到你的num
为止。
2.用递归的方法实现:
def factorial(n):
if n == 1: # 1
return n
return n * factorial(n - 1) # 2
num = int(input())
print(factorial(num)) # 3
2.1 设置一个下限,当n == 1
时,返回n
,使其不要再执行下面的factorial(n - 1)
2.2 返回 n * factorial(n - 1)
,factorial(n - 1)
为调用自己本身的函数,n - 1
为实参,相当于把n
进行-1
操作,比如输入的num
为4
,那这里的n-1
就为3
,把3
传进factorial
再进行计算,就相当于是4 * 3 * 2 * 1
2.3 最后调用factorial
函数,括号里面的num
为实参,是实际意义上的参数,是一个实际存在的参数,n
为形参,形式上的参数,可以理解为数学的X
,没有实际的值,括号里面的num
传进去才能进行计算,最后再打印出结果。
小结
递归的要求
递归算法所体现的“重复”一般有三个要求:
(1)每次调用在规模上都有所缩小(通常是减半)
(2)是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出作为后一次的输入)
(3)在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模位达到直接解答的大小为条件)无条件递归调用将会成为死循环而不能正常结束。