wzg356 发表于 2022-10-7 16:33:34

改用mapcar还可以提高10~20%速度,以前全测过mapacar比repeat,foreach,while都快

llsheng_73 发表于 2022-10-7 16:42:30

tigcat 发表于 2022-9-30 21:51
3#楼返回值应该((1) (2 3 4) (5 6 7) (8 9 10) (11 12 13))是这样子。

为什么不能是((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))?

tigcat 发表于 2022-10-7 17:43:13

cchessbd 发表于 2022-10-7 16:13
恩,不错,这个才是正确的。顶楼函数有问题,不要下。

楼主函数在表元素个数L,划分维数n,L=k*n,k-整数,时效率很高。

tigcat 发表于 2022-10-7 17:47:08

llsheng_73 发表于 2022-10-7 16:42
为什么不能是((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))?

我是运行后得到的结果。程序有个转置函数,从最后的元素开始满足。可以将cons换成list 与car组合。就不会出现这个问题了。

llsheng_73 发表于 2022-10-7 18:03:13

本帖最后由 llsheng_73 于 2022-10-7 18:30 编辑

tigcat 发表于 2022-10-7 17:47
我是运行后得到的结果。程序有个转置函数,从最后的元素开始满足。可以将cons换成list 与car组合。就不会 ...
我一直以来用的是while+repeat的,测试了下,速度确实比先reverse再foreach慢很多,综合了一下几个楼层的代码,得到代码如下,经测试,结果是正确的,速度还行吧,反正我要把我以前的换成下边这个了
(defun divlst(lst n / l l2)
(if(< 0 n(length lst))
    (progn
      (repeat(rem(length(setq lst(reverse lst)))n)
      (setq l(cons(car lst)l)lst(cdr lst)))
      (and l(setq l2(cons l l2)l nil))
      (foreach x lst
      (if(=(length(setq l(cons x l)))n)
          (setq l2(cons l l2)l nil)))
      l2)
    (list lst)))
从表头开始,多余的尾巴保持在最后
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) 3)=>((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12) 3)=>((1 2 3) (4 5 6) (7 8 9) (10 11 12))
例外情况处理
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) 50)=>((1 2 3 4 5 6 7 8 9 10 11 12 13))
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) -1)=>((1 2 3 4 5 6 7 8 9 10 11 12 13))


llsheng_73 发表于 2022-10-7 18:19:53

尘缘一生 发表于 2022-9-30 21:35
不完善,不足分组的会舍弃,应该这样




(XL-DIV '(1 2 3 4 5 6 7 8 9 10 11 12 13) 13)=>(nil (1 2 3 4 5 6 7 8 9 10 11 12 13))

tigcat 发表于 2022-10-7 19:21:30

llsheng_73 发表于 2022-10-7 18:03
我一直以来用的是while+repeat的,测试了下,速度确实比先reverse再foreach慢很多,综合了一下几个楼层的 ...

是挺好使,这个reverse多了影响速度

aeo000000 发表于 2022-10-7 20:00:12

记得有人对fas研究,repeat foreach 都是用while写成的,楼上说while+repeat,速度比foreach慢很多,没道理

llsheng_73 发表于 2022-10-7 20:25:24

aeo000000 发表于 2022-10-7 20:00
记得有人对fas研究,repeat foreach 都是用while写成的,楼上说while+repeat,速度比foreach慢很多,没道 ...

这个问题用while+repeat处理,少不了在while里边reverse,多次reverse把速度拖慢了

guosheyang 发表于 2022-10-8 08:24:20

本帖最后由 guosheyang 于 2022-10-8 08:55 编辑

wzg356 发表于 2022-10-7 16:33
改用mapcar还可以提高10~20%速度,以前全测过mapacar比repeat,foreach,while都快
针对本实例经测试少量数据时foreach快些但是如果将列表的数据长度加大比如10万个   再repeat100次   则是mapcar形式的运行稍微快点这只是针对纯数字的针对文本点坐标数据可能又不一样需要多测试   但是套上mapcar    需要加上lambda临时函数 多了这些环节 总觉得没有foreach那么简洁这是代码

(defun @group2(lst n / ITEM N NEW X)
(mapcar'(lambda(x)
            (setq item(cons x item))
            (if(= (length item) n)
               (setq new (cons item new) item nil)
            )
         )
(reverse lst)
)
new
)

页: 1 [2] 3
查看完整版本: 一个速度很快又简洁的列表分段函数