math@python双阶乘@累乘的多种实现方式

  • m ! ! = m ( m − 2 ) ( m − 4 ) ⋯ = ∏ i = 0 k ( m − 2 i ) q = f l o o r [ m 2 ] r = ( m ) % 2 ∈ { 0 , 1 } k = { q , r = 1 q − 1 , r = 0 熟悉计算机的同学 , 应该能够写出 k 展开式的简写形式 k = q − 1 + r ( r = 1 或 0 ) ; 从 0 开始计数 m!!=m(m-2)(m-4)\cdots =\prod_{i=0}^{k}(m-2i) \\ q=floor[\frac{m}{2}] \\ r=(m)\%2\in\{0,1\} \\ k=\begin{cases} q,r=1 \\ q-1,r=0 \end{cases} \\熟悉计算机的同学,应该能够写出k展开式的简写形式 \\ k=q-1+r(r=1或0);从0开始计数 m!!=m(m2)(m4)=i=0k(m2i)q=floor[2m]r=(m)%2{0,1}k={q,r=1q1,r=0熟悉计算机的同学,应该能够写出k展开式的简写形式k=q1+r(r=10);0开始计数

    • 上面两个k的展开式具有相同的效果,后者的好处是可以简化代码(不需要判断r的值)

    • 事实上,容易发现序列S=m,m-2,m-4,...是一个等差数列

      • a 1 = m a_1=m a1=m

      • d = − 2 d=-2 d=2

      • a k = a 1 − 2 ( k − 1 ) a_k=a_1-2(k-1) ak=a12(k1)

        • 从1开始计数
      • 根据m的奇偶性,最后一项记为 a k a_k ak

        • a k = 1 , m % 2 = 1 a_k=1,m\%2=1 ak=1,m%2=1
        • a k = 2 , m % 2 = 0 a_k=2,m\%2=0 ak=2,m%2=0
        • 合起来写,就是 a k = 2 1 − m % 2 a_k=2^{1-m\%2} ak=21m%2
      • 2 ( k − 1 ) = a 1 − a k k = a 1 − a k 2 + 1 k 1 = m − 1 2 + 1 = m + 1 2 , m % 2 = 1 k 2 = m − 2 2 + 1 = m 2 , m % 2 = 0 合起来写 k = c e i l ( m 2 ) ; 从 1 计数 k 0 = c e i l ( m 2 ) − 1 = f l o o r ( m 2 ) + m % 2 − 1 ; 从 0 开始计数 ⌈ x ⌉ = { ⌊ x ⌋ = x , x ∈ Z ⌊ x ⌋ + 1 , x ∉ Z 2(k-1)=a_1-a_k \\k=\frac{a_1-a_k}{2}+1 \\k_1=\frac{m-1}{2}+1=\frac{m+1}{2},m\%2=1 \\k_2=\frac{m-2}{2}+1=\frac{m}{2},m\%2=0 \\合起来写 \\k=ceil(\frac{m}{2});从1计数 \\k_0=ceil(\frac{m}{2})-1=floor(\frac{m}{2})+m\%2-1;从0开始计数 \\ \lceil{x}\rceil =\begin{cases} {\lfloor{x}\rfloor=x},&x\in{Z} \\ {\lfloor{x}\rfloor}+1,&x\notin{Z} \end{cases} 2(k1)=a1akk=2a1ak+1k1=2m1+1=2m+1,m%2=1k2=2m2+1=2m,m%2=0合起来写k=ceil(2m);1计数k0=ceil(2m)1=floor(2m)+m%21;0开始计数x={x=x,x+1,xZx/Z

地推关系

  • m ! ! = m ⋅ ( m − 2 ) ! ! m!!=m\cdot{(m-2)!!} m!!=m(m2)!!

    • 从分割的角度,序列S包含的项数n可以这样确定
      • 相邻项的关系是 a i = a i − 1 − 2 a_i=a_{i-1}-2 ai=ai12
    • 对于有限数列
      • 将第一项理解为,资源总量 a 1 a_1 a1
      • 第二项为每次消耗的固定量资源(d)
      • 那么数列的项数和第一项和公差的比值 a 1 d \frac{a_1}{d} da1有关

参考代码

  • # importing functools for reduce()
    # import functools as ft
    from functools import reduce
    def df_reduce(n):
    l = range(n, 0, -2)
    res = reduce(lambda x, y: x * y, l)
    # print("n=%-3d-->" % n, "{:-^30}".format(list_str), "product_res=%d" % res)
    return res
    def df_while(n):
    res = 1
    while (n > 0):
    res *= n
    n = n-2
    return res
    def product(x, y):
    return x*y
    def df_k(n):
    q = n//2
    r = n % 2
    k = q-1+r
    l = range(0, k+1)
    res_list = [n-2*i for i in l]
    res = reduce(product, res_list)
    return res
    def df_recursive(n):
    if (n == 1 or n == 2):
    return n
    return n*df_recursive(n-2)
    def df_print(df_fun, n):
    res = df_fun(n)
    print("n=%-3d-->" % n, "product_res=%d" % res)
    def df_reduce_print(n):
    df_print(df_reduce, n)
    def df_while_print(n):
    df_print(df_while, n)
    def df_k_print(n):
    df_print(df_k, n)
    def df_recursive_print(n):
    df_print(df_recursive, n)
    def test(df_implements):
    for df_fun in df_implements:
    print("{:*^70}".format(str(df_fun)))
    list(map(df_fun, test_list))
    ##
    test_list = [3, 4, 5, 8, 9, 16]
    if __name__ == "__main__":
    # res = list(map(df_while_print, test_list))
    df_implements = [df_k_print, df_while_print, df_reduce_print,df_recursive_print]
    test(df_implements)
    # list(map(df_recursive_print,test_list))
    # print(df_k(5))
  • PS D:\repos\PythonLearn\scripts> py double_factorial.py
    *************<function df_k_print at 0x00000194A7110160>**************
    n=3 --> product_res=3
    n=4 --> product_res=8
    n=5 --> product_res=15
    n=8 --> product_res=384
    n=9 --> product_res=945
    n=16 --> product_res=10321920
    ***********<function df_while_print at 0x00000194A71100D0>************
    n=3 --> product_res=3
    n=4 --> product_res=8
    n=5 --> product_res=15
    n=8 --> product_res=384
    n=9 --> product_res=945
    n=16 --> product_res=10321920
    ***********<function df_reduce_print at 0x00000194A7110040>***********
    n=3 --> product_res=3
    n=4 --> product_res=8
    n=5 --> product_res=15
    n=8 --> product_res=384
    n=9 --> product_res=945
    n=16 --> product_res=10321920
    *********<function df_recursive_print at 0x00000194A71101F0>**********
    n=3 --> product_res=3
    n=4 --> product_res=8
    n=5 --> product_res=15
    n=8 --> product_res=384
    n=9 --> product_res=945
    n=16 --> product_res=10321920
    PS D:\repos\PythonLearn\scripts>
posted @   xuchaoxin1375  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-09-20 URL_什么是URL(file url for windows examples)
点击右上角即可分享
微信分享提示