math@python双阶乘@累乘的多种实现方式
admin
2024-05-03 19:37:18
0
  • m!!=m(m−2)(m−4)⋯=∏i=0k(m−2i)q=floor[m2]r=(m)%2∈{0,1}k={q,r=1q−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(m−2)(m−4)⋯=i=0∏k​(m−2i)q=floor[2m​]r=(m)%2∈{0,1}k={q,r=1q−1,r=0​熟悉计算机的同学,应该能够写出k展开式的简写形式k=q−1+r(r=1或0);从0开始计数

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

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

      • a1=ma_1=ma1​=m

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

      • ak=a1−2(k−1)a_k=a_1-2(k-1)ak​=a1​−2(k−1)

        • 从1开始计数
      • 根据m的奇偶性,最后一项记为aka_kak​

        • ak=1,m%2=1a_k=1,m\%2=1ak​=1,m%2=1
        • ak=2,m%2=0a_k=2,m\%2=0ak​=2,m%2=0
        • 合起来写,就是ak=21−m%2a_k=2^{1-m\%2}ak​=21−m%2
      • 2(k−1)=a1−akk=a1−ak2+1k1=m−12+1=m+12,m%2=1k2=m−22+1=m2,m%2=0合起来写k=ceil(m2);从1计数k0=ceil(m2)−1=floor(m2)+m%2−1;从0开始计数⌈x⌉={⌊x⌋=x,x∈Z⌊x⌋+1,x∉Z2(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(k−1)=a1​−ak​k=2a1​−ak​​+1k1​=2m−1​+1=2m+1​,m%2=1k2​=2m−2​+1=2m​,m%2=0合起来写k=ceil(2m​);从1计数k0​=ceil(2m​)−1=floor(2m​)+m%2−1;从0开始计数⌈x⌉={⌊x⌋=x,⌊x⌋+1,​x∈Zx∈/Z​

地推关系

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

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

参考代码

  • # importing functools for reduce()
    # import functools as ft
    from functools import reducedef 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 resdef df_while(n):res = 1while (n > 0):res *= nn = n-2return resdef product(x, y):return x*ydef df_k(n):q = n//2r = n % 2k = q-1+rl = range(0, k+1)res_list = [n-2*i for i in l]res = reduce(product, res_list)return resdef df_recursive(n):if (n == 1 or n == 2):return nreturn 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
    ***************************
    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
    ***********************
    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
    **********************
    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
    *******************
    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>
    

相关内容

热门资讯

打发时间一元一分红中麻将跑得快... 认准微——as099055或as022055——客服扣675434346免押%D%A
(盘点十款)1元1分正规麻将群... 正规广东红中癞子麻将,15张跑得快,一元一分群,24小时不熄火
哪里有熊猫一元一分广东麻将上下... +薇:mj08522或hz05832游戏类型:单挑,多人,亲友圈模式、秒上下,所有用户都是微信实名制...
“发慌!””清友会管清友“是陷... 网恋有风险,恋爱需谨慎!“他们”通过网页,社交软件,等形式发布有色广告,诱骗点击链接下载APP,随即...