明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1519|回复: 4

vl做递归过程中的变量空间问题

[复制链接]
发表于 2005-2-3 09:22:00 | 显示全部楼层 |阅读模式
我写一个排序的小程序,如下
(defun dimidiate(mlist / lo hi len mid x)
(setq len (length mlist))
(if (> len 2)
(progn
(setq lo '() hi '())
(setq mid (car mlist))
(foreach x (cdr mlist)
(if (> x mid)
(setq hi (cons x hi))
(setq lo (cons x lo))
)
)
(setq mlist (append (dimidiate hi) (cons mid (dimidiate lo))))
)
(progn
(if (= len 2)
(progn
(if (< (car mlist) (cadr mlist))
(setq mlist (reverse mlist))
(setq mlist mlist)
)
)
(setq mlist mlist)
)
)
)
)
我输入(dimidiate '(1 2 3 4)),想要的到的是(4 3 2 1),可是结果总是(4 3 2 4 3 2)
用单步调试的方法,发现似乎是在做
(setq mlist (append (dimidiate hi) (cons mid (dimidiate lo))))
里(dimidiate lo)时,lo参数有问题,lo的值会随着前面(dimidiate hi)运行变化。
想了老半天不知道如何解决,望大侠们帮帮小弟,非常感谢
发表于 2005-2-3 11:54:00 | 显示全部楼层
我这里返回的就是'(4 3 2 1)
排序可以用vl-sort函数,不用这么复杂,
AUTOLISP的排序函数:
;(xl-sort lst fun) = 以取代vl-sort函数,用法相同(lsp)---------------by 无痕
(defun xl-sort (lst fun / nlst)
(foreach n lst (setq nlst (xl-isort n nlst fun)))
)
(defun xl-isort (item lst fun / k nlst)
(setq k T
nlst (apply 'append
(mapcar '(lambda (x)
(if (and K ((eval fun) item x))
(progn (setq k nil) (list item x))
(list x)
)
)
lst
)
)
)
(if k
(append lst (list item))
nlst
)
)
 楼主| 发表于 2005-2-5 11:18:00 | 显示全部楼层
我试过用vl-sort,不知道怎么回事当表的长度比较长时,比方说有1000个时,返回的却不到1000个,所以我参考二叉树法自己编了这一个。


我再去运行一下,看看结果。
发表于 2005-2-5 16:13:00 | 显示全部楼层
返回得不到1000个?不可能。。。建议你还是看看你使用时出现了什么问题吧,因为你给的这个函数在你那返回跟我的也不一样,


有现成的函数,却自己去编一个新的,不是多此一举吗
 楼主| 发表于 2005-2-5 16:48:00 | 显示全部楼层
我是想编几个排序的函数,比较一下的。


也真奇怪,今天两个都可以了,vl-sort的效率略为好一些。


莫非是被vl给玩一把,害得我苦思了好几天。


现在终于好了,多谢meflying兄指点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-9-29 18:27 , Processed in 0.244658 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表