基础母函数的变形(非空)
n个完全一样的球放到m个有标志的盒子中,不允许有空盒,问有多少种不同的方案?
f(x)=(x+x^2+...)^m 这个是形式,目前我们要推导出对于特定的m,n,用数学的方法算出和用程序解答出来是一样的。
Go
f(x)=x^m/(1-x)^m=x^m*(1-x)^(-m)
这样对于特殊的n,要求的就是(1-x)^(-m)中的x的n-m系数,根据公式有:
result=C(n-m+ m-1,n-m)=C(n-1, n-m)
下面写程序来证明:
(setq m 5)
(defun pow (num count)
(if (or (> count 1) (eq count 1) )
(* num
(pow num
(- count 1) ) )
1))
(defun slayer ( count)
(if (or (> count 1) (eq count 1) )
(* count
(slayer
(- count 1) ) )
1))
(defun slayerex (num count)
(if (or (> count 1) (eq count 1) )
(* num
(slayerex
(- num 1)
(- count 1) ) )
1))
(defun exprhelp (n m )
(if (or (> n m)
(eq n m) )
(+ (expr (- n 1)
(- m 1) )
(exprhelp (- n 1)
m))
0))
//下面的条件判断改了点.不允许不拿了
(defun expr (n m)
(if (< n m)
0
(if (and (eq m 0)
(eq n m) )
1
(if (eq m 0)
0
(exprhelp n
m)))))
(defun formula (n m)
(if (> n m)
(/ (slayerex (- n 1)
(- n m))
(slayer (- n m)))
0))
(defun test (n)
(if (> n 0)
(progn
(print (expr n m ))
(print 'compare)
(print (formula n m ))
(test (- n 1)))
(print 'over)))
(test 24)
注意这里n必须大于m,否则为结果为0,从下面结果中也能看到。
[93]> (test 24)
8855
COMPARE
8855
7315
COMPARE
7315
5985
COMPARE
5985
4845
COMPARE
4845
3876
COMPARE
3876
3060
COMPARE
3060
2380
COMPARE
2380
1820
COMPARE
1820
1365
COMPARE
1365
1001
COMPARE
1001
715
以上的逻辑判断的代码写得不好。