乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 101|回复: 18

[编程交流] 第n个替换(合并排序

[复制链接]

3

主题

27

帖子

25

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 08:31:01 | 显示全部楼层 |阅读模式
我已经基于Ellis Dee的vb6版本在Autolisp中完成了MergeSort算法的实现:http://www.vbforums.com/showpost.php?p=2909257&postcount=12
 
问题是我需要替换lisp数组中的第n个原子,目前唯一可以实现这一点的方法是迭代整个列表。这需要一个壮观的排序算法,并通过对列表进行第n次(log)迭代来破坏其效率。我会尽量不让水太浑浊,但这是我的第n个替换函数,基于Michels第n个移除函数。。。
 
  1.   (defun nth-replace (n_atom f_list f_n / ) ;replaced the nth element of a list
  2.    ;n_atom is new atom
  3.    ;f_list is list to be operated on
  4.    ;f_n is the index that will be replaced
  5.    (if (and (numberp f_n) (listp f_list))
  6.      (if (and (>= f_n 0) (< f_n (length f_list)) n_atom)
  7. (progn
  8.   (repeat f_n
  9.     (setq f_list (append (cdr f_list) (list (car f_list))))
  10.     )
  11.   (setq f_list (append (cdr f_list) (list n_atom)))
  12.   (repeat (- (length f_list) f_n 1)
  13.     (setq f_list (append (cdr f_list) (list (car f_list))))
  14.     )
  15.   )
  16. )
  17.      )
  18.    f_list
  19.    );defun

 
我对autolisp并不完全陌生,但我希望有一个我忽略的基本函数,可以在某个级别替换原子,或者可以将列表返回到某个原子(第n个实例),然后我可以附加我的更改,然后是列表的后半部分。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 08:34:55 | 显示全部楼层
考虑这个例子:
 
 
林奇
 
**编辑-来自VLIDE控制台的示例:
 
  1. REPLACE3
  2. _$ (replace3 '(1 2 3 3 2 1) 3 4)
  3. (1 2 3 4 2 1)
  4. _$
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 08:40:49 | 显示全部楼层
第一个想法。。
  1. (defun nth-rep (x l n / i)
  2. (setq i -1)
  3. (mapcar '(lambda (a) (cond ((= (setq i (1+ i)) n) x) (a))) l)
  4. )

编辑:哎呀。。。太晚了
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 08:43:09 | 显示全部楼层
快一点,但应该有用。。。
 
  1. (defun _nthReplace (item index lst)
  2. (if (and lst (> index 0))
  3.    (cons (car lst) (_nthReplace item (1- index) (cddr lst)))
  4.    (cons item (cdr lst))
  5. )
  6. )
回复

使用道具 举报

3

主题

27

帖子

25

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 08:44:26 | 显示全部楼层
伦德曼/斯特凡BMR
壮观的先生们。非常壮观。
如果我能表达我的喜悦,我将不得不键入大约5000次。
 
这很有道理,我很尴尬。优化时没有重新创建变量。
因此,在测试了IF和COND方法之后,IF在处理1000个随机数时以3秒的优势获胜。请记住,其中任何一个距离我拥有的都有光年,我在几个小时后停止了处理。
 
如果结果:
  1. Time:
  2. 15.19 seconds
  3. ; 10 forms loaded from #<editor ".../mergesort2.LSP">
  4. _1_$

 
COND结果:
  1. Time:
  2. 18.02 seconds
  3. ; 10 forms loaded from #<editor ".../mergesort2.LSP">
  4. _1_$

 
 
在单独的线程中发布合并排序。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 08:49:51 | 显示全部楼层
 
李值得赞扬的是我在上面发布的代码,因为他将该产品作为我自己的增强版(在同一帖子的前面,链接在上面)。英雄联盟
 
... 不过,我很高兴这对你有帮助。
回复

使用道具 举报

7

主题

143

帖子

136

银币

初来乍到

Rank: 1

铜币
36
发表于 2022-7-6 08:52:51 | 显示全部楼层
读了这篇文章后,我有一个问题。在AutoLisp中,为什么subst不工作?
 
  1. (subst ITEM (nth INDEX LST) LST)
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 08:57:09 | 显示全部楼层
尝试
  1. (subst 1 0 '(0 1 0 2 0))
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:00:10 | 显示全部楼层
斯特凡是正确的-李也向我提出了这一点,在上面的链接线程。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:03:18 | 显示全部楼层
我认为重点是替换第n项,而不是每个匹配项。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 08:50 , Processed in 0.742129 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表