[求助]有关于列表(函数)问题请教
<p>麻烦高手检视下面程序有何问题<br/>希望执行结果<br/>(Q_1 h_lst "AA")---->回应 102<br/>(Q_1 h_lst "BB")---->回应 200<br/>(Q_1 h_lst "CC")---->回应 350<br/>(Q_1 h_lst "DD")---->回应 500<br/>(Q_1 h_lst "EE")---->回应 0 列表中"EE"不存在时回应 0</p><p><br/>程序如下:<br/>;;;(SETQ h_lst '((1.0 "AA" 102)(1.0 "BB" 200)(1.0 "CC" 350)(1.0 "DD" 550))) <br/>;;;(Q_1 h_lst "AA") <br/>;;;回应 102 <br/>;;;(Q_1 h_lst "EE") <br/>;;;回应 102 <br/>(defun Q_1 (LST WORD_T) <br/> (FOREACH x LST <br/> (if (= (NTH 1 x) WORD_T) <br/> (setq XX (NTH 2 x)) <br/> ;(setq XX 0) ;;假如我加了这一列,为何所有回应都为 0 <br/> ) <br/> ) <br/> XX <br/>)</p> 本帖最后由 作者 于 2008-8-14 20:03:14 编辑 <br /><br /> <p>你要是把"AA"放到首位,用一个函数assoc就解决了,都不用子程序</p><p>;;;(SETQ h_lst '(("AA" 102 1.0)("BB" 200 1.0)("CC" 350 1.0)("DD" 550 1.0))) <br/>;;;(cadr (assoc "AA" h_lst)) 返回 102 </p><p>;;;(cadr (assoc "BB" h_lst)) 返回 200 </p> <p>你用了foreach就是找到了你的结果</p><p>还是会遍历下去,所以就xx=0了(除去你找的就是最后一个)!</p><p>这类程序用while可以找到就退出遍历,比foreach省时。。。。。</p> 本帖最后由 作者 于 2008-8-15 9:14:27 编辑 <br /><br /> <p>首先,感谢两位楼主的回覆.</p><p>我试着调整程序,但还无法达到预期的结果,可否请两位或各位高手帮忙查看是拿出了问题<谢谢!> </p><p>;;;有关于列表(函数)问题请教</p><p>;;;麻烦高手检视下面程序有何问题<br/>;;;希望执行结果<br/>;;;(Q_1 h_lst "AA")---->回应 102<br/>;;;(Q_1 h_lst "BB")---->回应 200<br/>;;;(Q_1 h_lst "CC")---->回应 350<br/>;;;(Q_1 h_lst "DD")---->回应 500<br/>;;;(Q_1 h_lst "EE")---->回应 0 列表中"EE"不存在时回应 0</p><p><br/>;;;程序如下:<br/>;;;(SETQ lst '((1.0 "AA" 102)(1.0 "BB" 200)(1.0 "CC" 350)(1.0 "DD" 550)))<br/>;;;(Q_1 lst "AA")<br/>;;;回应 102<br/>(defun Q_1 (LST WORD_T)<br/> (SETQ j 0)<br/> ;(REPEAT (LENGTH LST)<br/> (WHILE (= YY WOED_T)<br/> (SETQ YY (NTH 1 (NTH j LST)))<br/> (SETQ LST_P (NTH j LST))<br/> (SETQ j (1+ j))<br/> )<br/> ;)<br/> (if (/= YY NIL)<br/> (setq XX (NTH 2 LST_P))<br/> (setq XX 0)<br/> )<br/> XX</p><p>)</p> <p>(SETQ lst '((1.0 "AA" 102)(1.0 "BB" 200)(1.0 "CC" 350)(1.0 "DD" 550)))</p><p><br/>(defun Q_1 (lst x / )<br/> (cdr (assoc x (mapcar 'cdr lst)))<br/>)</p><p>;;;(Q_1 h_lst "EE")---->回应 0 列表中"EE"不存在时回应 0</p><p>返回0不是太好,假如表中包含项(1.0 "EE" 0),则无法区分...</p><p></p> <p>感谢<strong><font face="Verdana" color="#61b713">caoyin帮忙.</font></strong></p><p><strong><font face="Verdana" color="#61b713">谢谢!</font></strong></p> 曹大侠这个 mapcar 用的好啊 <p>表很短还可以用一次mapcar,(遍历时间用的不多)</p><p>表如果很长,终究还是while的天下(根本就不用遍历)。。。。。</p> <p><font face="Verdana" color="#2543b9">fsxm你好:</font></p><p><font face="Verdana" color="#2543b9">若以(while....)方式,写上面的程序该,如何表达阿!</font></p><p><font face="Verdana" color="#2543b9">麻烦你解惑,谢谢!</font></p> <p>用 mapcar 其实就是写起来方便,复杂的自然是while快</p><p>(SETQ lst '((1.0 "AA" 102)(1.0 "BB" 200)(1.0 "CC" 350)(1.0 "DD" 550)))</p><p>(defun Q_1 (lst x)<br/> (while (and (/= (cadar lst) x) (setq lst (cdr lst))))<br/> (caddar lst)<br/>)</p>
页:
[1]
2