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>
    

相关内容

热门资讯

守望先锋手游新手入门指南:冲锋... 《守望先锋》手游采用4V4竞技模式,每位英雄拥有独特技能机制与定位。新手玩家若想快速掌握操作节奏、提...
守望先锋手游最强冲锋角色推荐及... 在《守望先锋》手游当前版本中,可选用英雄数量丰富,不同角色凭借其机制特性,在实战中展现出鲜明的战术定...
守望先锋手游最强阵容推荐:高胜... 《守望先锋》手游在2026年正式上线后,凭借高度还原的IP世界观与适配移动平台的操作逻辑,迅速成为战...
2026热门复古传奇手游排行榜... 2026年最受玩家青睐的复古传奇类手游有哪些?这类作品延续经典IP内核,以高自由度战斗体系、强社交互...
小森生活村长好感度提升方法与实... 村长是玩家自宅所在小镇的核心互动角色,与其建立稳固关系可触发专属隐藏剧情。初次相遇时,村长位于自宅旁...
异人之下手游入世任务全流程详解... 入世任务是《异人之下》手游中专为新玩家设计的核心入门体系,它将剧情推进、操作教学与资源获取三者有机整...
2026年最受欢迎的消除类游戏... 消除类手游凭借其轻松上手、节奏舒缓、逻辑清晰的特点,持续吸引大量休闲玩家。五款当前热度突出、机制差异...
如龙0闪退怎么办?三个简单有效... 《如龙0:誓约的场所》作为《如龙》系列中广受赞誉的经典作品,凭借扎实的叙事结构、细腻的角色塑造与沉浸...
守望先锋手游双排强势阵容推荐:... 《守望先锋》手游当前已上线多种竞技模式,其中4v4对战虽广为人知,但双人组队玩法同样具备极高战术价值...
体育App推荐 好用的体育类应... 体育爱好者越来越多,如何找到适合自己的运动方式,并与同好交流互动?一款功能实用、体验良好的体育类应用...