简单的stirling数(区别)
这里假设容器是没有区别的,数字也是有区别的。
这样就是说,比如1,3放第一个盒,2,4放第二个盒与1,3放第二个盒,2,4放第一个盒是一样的;
假设n大于2,将这样的n个数放入到2个容器中,问有多少种放的方法?
有这样的推导思想,假设其中一个数放入到了任意一个容器中,那其它n-1个球中的每个球就有了两种选择方式,共有2^(n-1)种方式,不过要减去一种特殊情况;注意在这里就不需要除以2了,第一个球就相当于一个支点;
所以在写程序的时候就将第一个点做为默认的,而只考虑后面的n-1个点的情况;
下面写程序来证明:
(defun formula (n)
(+ (pow 2
(1- n))
-1))
(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 expr (n AContain BContain )
(if (> n 0)
(+ (expr (1- n)
(1+ AContain )
BContain)
(expr (1- n)
AContain
(1+ BContain)))
(if (or (eq AContain 0)
(eq BContain 0))
0
1)))
特别注意其中expr参数的变化
(defun test (n)
(if (> n 1)
(progn
(print (expr (1- n) 1 0))
(print 'compare)
(print (formula n))
(test (- n 1)))
(print 'over)))
[17]> (test 10)
511
COMPARE
511
255
COMPARE
255
127
COMPARE
127
63
COMPARE
63
31
COMPARE
31
15
COMPARE
15
7
COMPARE
7
3
COMPARE
3
1
COMPARE
1
OVER
OVER
思维:用(print (expr (1- n) 0 1))替换test函数的对应部分,结果也是对的;
这里假设容器是没有区别的,数字也是有区别的。
这样就是说,比如1,3放第一个盒,2,4放第二个盒与1,3放第二个盒,2,4放第一个盒是一样的;
假设n大于2,将这样的n个数放入到2个容器中,问有多少种放的方法?
有这样的推导思想,假设其中一个数放入到了任意一个容器中,那其它n-1个球中的每个球就有了两种选择方式,共有2^(n-1)种方式,不过要减去一种特殊情况;注意在这里就不需要除以2了,第一个球就相当于一个支点;
所以在写程序的时候就将第一个点做为默认的,而只考虑后面的n-1个点的情况;
下面写程序来证明:
(defun formula (n)
(+ (pow 2
(1- n))
-1))
(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 expr (n AContain BContain )
(if (> n 0)
(+ (expr (1- n)
(1+ AContain )
BContain)
(expr (1- n)
AContain
(1+ BContain)))
(if (or (eq AContain 0)
(eq BContain 0))
0
1)))
特别注意其中expr参数的变化
(defun test (n)
(if (> n 1)
(progn
(print (expr (1- n) 1 0))
(print 'compare)
(print (formula n))
(test (- n 1)))
(print 'over)))
[17]> (test 10)
511
COMPARE
511
255
COMPARE
255
127
COMPARE
127
63
COMPARE
63
31
COMPARE
31
15
COMPARE
15
7
COMPARE
7
3
COMPARE
3
1
COMPARE
1
OVER
OVER
思维:用(print (expr (1- n) 0 1))替换test函数的对应部分,结果也是对的;