用差分方程对算法进行精确分析
a(n)=A*a(n/2)+C ,initvalue a(1)=1 ,a(2)=A+C ,a(4)=A*(A+C)+C
由于以前的积累,可以直接假定a(n)=M*A^{(log n)/(log 2)}+N
(上式可以化简为a(n)=M*n^{(log A)/(log 2)}+N ,与主方法联系起来了)
Go
a(1)=1=M+N
a(2)=A+C=M*A+N
Go
M=1+C/(A-1)
N=-C/(A-1)
(setq A 2.0)
(setq C 5.0)
(setq M (+ 1
(/ C (- A 1))))
(setq N (- 0
(/ C (- A 1))))
(defun pow (num count)
(if (> count 0)
(* num (pow num (- count 1) ) )
1
)
)
(defun expr (n)
(if (eq n 1)
1
(+ (* (expr (/ n 2)) A )
C)))
(defun formula (num)
(+ (* M
(pow A
(/ (log num)
(log 2.0))))
N))
(defun test (n)
(if (> n 0)
(progn
(print (formula n))
(print 'compare)
(print (expr n))
(test (- (/ n 2) (mod n 2))))
(print 'over)))
(test 64)