tigcat 发表于 2022-10-4 22:14:48

本帖最后由 tigcat 于 2022-10-4 22:43 编辑

guosheyang 发表于 2022-10-4 19:03
tigcat朋友说的没错当数据量大的时候(复制成6万个左右的数字) ,的确while循环的代码(caoyin版主的 ...
guosheyang大侠研究仔细,学习啦.晚上有点时间,我也试了试caoyin版主的代码,证实效率很高
(setq l'(1 4 7 10 13 16 19 24 33 46 3 6 9 12 15 18 21 67 43 78 2 5 8 11 14 17 20 76 78 99))
(repeat 12 (setq L(append L L)));有122880数据
(defun tt (lst /)
(setq stime (getvar "millisecs"))
(while lst
    (setq lst2 (cons (list (car lst) (cadr lst) (caddr lst) (cadddr lst) (cadddr (cdr lst))) lst2)
          lst(cddddr (cdr lst))
    )
)
(reverse lst2)
(setq zsj(-(getvar "millisecs") stime))
)
;(tt l)
;运行了好几次都在100ms以下,最快30ms,最慢91ms,平均值60ms左右。基本我的老爷机都是秒出结果


;;;;2#我写的也测试了一把

(defun tt(lst / )
(setq stime (getvar "millisecs"))
(setq i 0 lst1 nil lst2 nil)
(repeat (/ (length l) 5)
(repeat 5
    (setq lst1(cons (nth i l) lst1))
    (setq i (1+ i))
    )
(setq lst2 (cons (reverse lst1) lst2))
(setq lst1 nil)

)
(reverse lst2)
(setq zsj(-(getvar "millisecs") stime))
)

;最后用时25188ms,好慢啊


;;;caoyin版主建议第一个reverse取消,用list组表,根据版主建议,改写2楼的代码

(defun tt(lst / )
(setq stime (getvar "millisecs"))
(setq i 0 lst1 nil lst2 nil)
(repeat (/ (length l) 5)

    (setq lst1(list (car lst)(cadr lst)(caddr lst)(cadddr lst)(cadddr (cdr lst))))
   
   
(setq lst2 (conslst1 lst2))
(setq lst1 nil)
(setq lst (cdr (cddddr lst)))
)
(reverse lst2)
(setq zsj(-(getvar "millisecs") stime))
)
;这个运行速度和版主的差不多啦.从25000ms提升到50ms左右,提升了499倍,当然我这代码简洁度差caoyin版主的可就多啦




;;;;楼主前些天发帖的代码我也试了试

(defun @group (lst n / item )
   (setq stime (getvar "millisecs"))
    (foreach element(reverse lst)
      (setq item(cons element item))
      (if(= (length item) n)
         (setq new (cons item new) item nil)
      )
    )
    (setq zsj(-(getvar "millisecs") stime))
);结果在100ms-120ms之间,保持了极高的速率,并且是通用的。



;以上测试均默认维数n与表L的长度是整数倍关系。

vitalgg 发表于 2022-10-7 20:51:47

需要回溯的递归才会慢。就是你们口中的效率低下。
尾递归快的一批。

tigcat 发表于 2022-10-7 23:43:48

vitalgg 发表于 2022-10-7 20:51
需要回溯的递归才会慢。就是你们口中的效率低下。
尾递归快的一批。

张大,常规递归便于理解和书写,尾递归函数不能作为表达式的一部分,感觉没那么容易写呢.

vitalgg 发表于 2022-10-8 17:21:50

tigcat 发表于 2022-10-7 23:43
张大,常规递归便于理解和书写,尾递归函数不能作为表达式的一部分,感觉没那么容易写呢.

是的,尾递归需要多一个参数。这个参数可以避开栈叠加。
一般递归需要层层压栈,最后再逐个出栈。
页: 1 [2]
查看完整版本: 求多维数组转5维数组的非递归方法