计算一个数的阶乘和一个列表的逆序数
问题1:计算一个数的阶乘,也是一个全排列的问题。
比如:将数字1,2,3按照不同元素排成一列,总共有多少种排法?
3*2*1=6。也就是数字3的阶乘。
那么怎么用程序来实现呢?
def factorial(num): """ 递归算法 :param num: :return: """ if num == 1: return 1 return num * factorial(num - 1)
在递归函数中,由于会有函数栈帧的开销,所以它的运行效果并不如非递归函数的好。
def factorial1(num): """ 非递归算法 :param num: :return: """ res = 1 while num > 0: res *= num num -= 1 return res
问题2:计算一个数列的逆序数。
逆序数:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。
def get_reverse_num(lst): res = 0 for i in range(len(lst)): s = 0 for j in range(i): if lst[j] > lst[i]: s += 1 res += s return res