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)
根据m的奇偶性,最后一项记为aka_kak
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−akk=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)!!
# 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>