本帖最后由 作者 于 2010-9-27 15:28:39 编辑
下面举个例子来说明下递归效率:
编写一个叫cartesian的函数,
功能:> (cartesian '(1 2 3) '(4 5)) ((1 . 4) (1 . 5) (2 . 4) (2 . 5) (3 . 4) (3 . 5))
分别采用3种写法
方法1:嵌套递归- ;;by GSLS(SS)
- ;;;要求使用嵌套递归函数完成
- (defun stitch (l2 e)
- (cond ((null (cadr l2))
- (list (cons e (car l2))))
- (t (cons (cons e (car l2)) (stitch (cdr l2) e))))
- )
- (defun cartesian (l1 l2)
- (cond ((null (cadr l1))
- (stitch l2 (car l1))
- )
- (t (append (stitch l2 (car l1)) (cartesian (cdr l1) l2)))
- )
- )
方法二:使用while循环递归- ;;;by GSLS(SS)
- ;;;使用while递归
- (defun cartesian0 (l1 l2 / lst a b l3)
- (setq lst nil)
- (while (setq a (car l1))
- (setq l1 (cdr l1)
- l3 l2)
- (while (setq b (car l3))
- (setq l3 (cdr l3))
- (setq lst (cons (cons a b) lst))
- )
- )
- (reverse lst)
- )
方法三:使用mapcar加临时函数遍历- (defun cartesian1 (l1 l2)
- (apply 'append
- (mapcar '(lambda (x)
- (mapcar '(lambda (y) (cons x y)) l2)
- )
- l1
- )
- )
- )
测试参数1——'(1 2 3 5 6 7) '(8 9 10) 运行次数10w次,时间结果如下:- _$
- 函数:CARTESIAN运行100000次测试结果00:00:08:437
- 函数:CARTESIAN0运行100000次测试结果00:00:04:905
- 函数:CARTESIAN1运行100000次测试结果00:00:06:983
- _$
复制代码 测试参数2——'(1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20) '(21 22 23 24 25 26 27 28 29 30) 行次数1w次,时间结果如下:- _$
- 函数:CARTESIAN运行10000次测试结果00:00:11:405
- 函数:CARTESIAN0运行10000次测试结果00:00:04:186
- 函数:CARTESIAN1运行10000次测试结果00:00:03:812
- _$
复制代码 测试参数3——'(1 2 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40) '(41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60) 行次数1w次,时间结果如下:- _$
- 函数:CARTESIAN运行10000次测试结果00:01:09:812
- 函数:CARTESIAN0运行10000次测试结果00:00:16:563
- 函数:CARTESIAN1运行10000次测试结果00:00:12:937
- _$
复制代码 随着链表长度的增加,由于未申请临时变量的递归耗用大量存储空间也随着增加,而申请了局部变量的递归和顺序遍历效率互有上下,小表时while循环递归更快,大表时mapcar遍历更快。
|