交替递归解fibs数列(线性复杂度)
(defun fibs_help (lst)
(cons (cons (+ (caar lst)
(cadar lst))
(list (caar lst)))
(list (car lst))))
(defun fibs (labelA labelB)
(if (eq labelB 1)
'((1 1) (1 0))
(fibs_help
(fibs labelB
(1- labelB)))))
(defun value (lst)
(caar lst))
(defun fibsex (n)
(if (eq n 1)
1
(if (eq n 2)
1
(+ (fibsex (- n 1))
(fibsex (- n 2))))))
(defun test (n)
(if (> n 1)
(progn
(print (value (fibs n (1- n))))
(print 'compare)
(print (fibsex n))
(test (- n 1)))
(print 'over)))
[42]> (test 15)
610
COMPARE
610
377
COMPARE
377
233
COMPARE
233
144
COMPARE
144
89
COMPARE
89
55
COMPARE
55
34
COMPARE
34
21
COMPARE
21
13
COMPARE
13
8
COMPARE
8
5
COMPARE
5
3
COMPARE
3
2
COMPARE
2
1
COMPARE
1
OVER
OVER
可以看到两者的结果是一样的,在做压力测试的时候比如40的时候,改进方法能很快出结果,而原来的需要很长很长的时间;
(defun fibs_help (lst)
(cons (cons (+ (caar lst)
(cadar lst))
(list (caar lst)))
(list (car lst))))
(defun fibs (labelA labelB)
(if (eq labelB 1)
'((1 1) (1 0))
(fibs_help
(fibs labelB
(1- labelB)))))
(defun value (lst)
(caar lst))
(defun fibsex (n)
(if (eq n 1)
1
(if (eq n 2)
1
(+ (fibsex (- n 1))
(fibsex (- n 2))))))
(defun test (n)
(if (> n 1)
(progn
(print (value (fibs n (1- n))))
(print 'compare)
(print (fibsex n))
(test (- n 1)))
(print 'over)))
[42]> (test 15)
610
COMPARE
610
377
COMPARE
377
233
COMPARE
233
144
COMPARE
144
89
COMPARE
89
55
COMPARE
55
34
COMPARE
34
21
COMPARE
21
13
COMPARE
13
8
COMPARE
8
5
COMPARE
5
3
COMPARE
3
2
COMPARE
2
1
COMPARE
1
OVER
OVER
可以看到两者的结果是一样的,在做压力测试的时候比如40的时候,改进方法能很快出结果,而原来的需要很长很长的时间;
本文介绍了使用交替递归方法解决Fibs数列问题的算法,该方法具有线性复杂度,适用于进行压力测试。通过比较改进方法与传统方法在不同数据规模下的性能,展示其在效率上的优势。

866

被折叠的 条评论
为什么被折叠?



