计算一个数的阶乘和一个列表的逆序数

问题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
一个队列的逆序数

 

posted @ 2019-10-16 18:49  walle_zhao  阅读(868)  评论(0编辑  收藏  举报