哔!您有一份程序员数学公式宝典,请查收

网上有一个经典的算法入门题:

虽然是个夸张的梗,但是也部分反映了一个现实,大部分的程序员童鞋(也包括我在内)是缺乏一定的数学素养的。一个常见的现象就像上面所展示的那样,看代码的时候贼顺溜,一看到数学部分就

在重新学习了一段时间数学基础后,我发现,数学本身的逻辑其实并非复杂到让人难以理解的程度。而最大的坎恐怕就是其中犹如天书般的数学符号吧?基于此,我想整理一个基于代码的数学符号释义,由于我本身的知识水平限制,若出现了部分错误,还希望各位Ladies和乡亲们海涵并指出。另,本文长期更新,欢迎大家补充和收藏。

No.1 \Sigma

含义:多项数之和

中文:西格玛

英文:sigma

小写:σ

公式解释: \sum_{i=1}^{n}{x_{i}}=x_{1} + x_{2} + \cdot\cdot\cdot +x_{n}

表示 x_{1} 到 x_{n} 的和,比如n=10的时候,就是10项的和

代码释义:

def sigmod(i, n):
    # Σ 多项数求和
    if not isinstance(i, int) or not isinstance(n, int):
        return False
    return reduce(lambda x, y: x+y, range(i, n+1))

相关拓展: \sum_{a}^{b}\sum_{i}^{j}{f\left( a,i \right)}

双西格玛号,要先求内部的加和再带入外部的求和中,举个🌰:

\sum_{a=1}^{5}\sum_{i=1}^{5}{a+i} = \sum_{a=1}^{5}(a + 1) + (a + 2) + (a + 3) + (a + 4) + (a + 5) = \sum_{a=1}^{5} (5a + 15)

后面的步骤就是如上一样的求和公式就可以解出来了

代码释义:

def double_sigmod(a, b, i, j, func=None):

    if not isinstance(a, int) or not isinstance(b, int) or not isinstance(i, int) or not isinstance(j, int) or not func:
        return False

    result = 0
    for k in range(a, b+1):
        for n in range(i, j+1):
            result += func(n, k)

    return result

参考资料:

quora.com/What-is-an-ex

No.2 \Pi

含义:多项数连续乘积

中文:

英文:pai

小写:π

公式解释: \prod_{i=1}^{n}x_{i} = x_{1} \times x_{2} \times x_{3} \times \cdot \cdot \cdot \times x_{n}

表示从 x_{1} 到 x_{n} 的连续乘积,比如n=10的时候,就是10项的乘积

代码释义:

def continue_multiply(i, n):
    '''
    Π 连乘 
    '''
    if not isinstance(i, int) or not isinstance(n, int):
        return False
    return reduce(lambda x, y: x*y, range(i, n+1))

No.3 n!

含义:一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。

中文:阶乘

英文:factorial

公式解释:n! =1 × 2 × \cdot \cdot \cdot × n

也可以理解为连乘的特例,条件限制为,即n只能为正整数,并且i从1开始

代码释义:

def factorial(n):
    '''
    n! 阶乘
    '''
    if not isinstance(n, int):
        return 'Invalid data, please input a int number'

    if n == 0 or n == 1:
        return 1

    else:
        return n * factorial(n-1)

No.4 C_{n}^{m}

含义:从n个不同元素中每次取出m(n≥m)个不同元素,组合在一起(不关心顺序)

中文:组合

英文:combination

公式解释: C_{n}^{m} = \frac{n!}{m!×(n-m)!}

可以理解为一个袋子中有n个标记的小球,从中拿出m个的组合方式。这个需要自己动手动笔算几次就比较容易理解了。

代码释义:

def combination(iter=None, m=0):
    '''
    从 n 中选出 m 个,进行组合 
    '''
    result = []
    tmp = [0] * m
    length = len(iter)

    def next_num(li=0, ni=0):
        if ni == m:
            result.append(copy.copy(tmp))
            return
        for lj in range(li, length):
            tmp[ni] = iter[lj]
            next_num(lj + 1, ni + 1)

    next_num()
    return (result, len(result))

No.5 A_{n}^{m} (或 P_{n}^{m} )

含义:从n个不同元素中每次取出m(1≤m≤n)个不同元素,排成一列(有顺序要求)

中文:组合

英文:permutation

公式解释: A_{n}^{m} = \frac{n!}{(n-m)!}

可以这么理解,从n个有标记的小球中,先取出来一个,然后再在接下来的n-1个元素中去除一个放到第二个位置,最后从n-m+1个元素中,取出一个放在第m个位置上

代码释义:

(备注,我那个n中选择m个的算法还没搞出来,只实现了全排列,后续搞明白了再补充

def permutation(iter=None, n=0):
    '''
     从 n 中选出 n 个,进行排列
    '''
    result = []
    tmp = [0] * n

    def next_num(arry, ni=0):
        if ni == n:
            result.append(copy.copy(tmp))
            return
        for lj in arry:
            tmp[ni] = lj
            arry_c = arry[:]
            arry_c.pop(arry.index(lj))
            next_num(arry_c, ni+1)

    next_num(iter[:], 0)
    return (result, len(result))

最后温馨提醒,本文会长期更新。也欢迎小伙伴补充更多不是很明了的数学公式,后续会继续完善。

另外,代码已经同步上传至GitHub,欢迎小伙伴follow和star:☞☞☞传送门戳这里

一道思考题:求1-100的和(要求时间复杂度最小,温馨提示:尽量使用数学知识)

About the author

张小鸡

日拱一卒,功不唐捐

1 comment

By 张小鸡