找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1223|回复: 11

[讨论]:如何将表中表的相对应的最大值组成新表

[复制链接]
发表于 2003-9-9 22:27:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
如:表中表为:
(
(4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 476.0) (3884.0 3275.0 2741.0 2262.0 1826.0 1339.0 990.0 666.0 476.0) (3663.0 3128.0 2643.0 2198.0 1784.0 1317.0 977.0 660.0 517.0)
)

结果表为:
(4000.0 3366.0 2814.0 2322.0 1784.0 1375.0 1017.0 685.0 517.0)

我的解决办法是:
(defun Max-Value-list ( Flist / n n1 n2 nn1 nn2 list1 list2 MaxVL)
  (setq n2 (length (car Flist))
        n 0
  )
  (repeat n2
    (setq list1 (mapcar '(lambda (x) (nth n x)) Flist))
    (setq n (1+ n))
    (setq list2 (vl-sort list1 '>))
    (setq MaxVL (cons (car list2) MaxVL))
  )
   (reverse MaxVL)
  )

请高手赐教!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-9-10 05:16:57 | 显示全部楼层
结果不会
(4000.0 3366.0 2814.0 2322.0 1784.0 1375.0 1017.0 685.0 517.0)
应为:
(4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 517.0)
程序还能简单:
(defun maxlist (flist / nlist nn)
  (setq n 0)
  (repeat (length (car flist))
    (setq nlist (append nlist (list (mapcar '(lambda (x) (nth n x)) Flist))))
    (setq n (1+ n))
  )
  (foreach i nlist (setq nn (append nn (list (apply 'max i)))))
);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-9-10 08:58:34 | 显示全部楼层

Re: [讨论]:如何将表中表的相对应的最大值组成新表

最初由 hewb 发布
[B]如:表中表为:
(
(4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 476.0)
(3884.0 3275.0 2741.0 2262.0 1826.0 1339.0 990.0 666.0 476.0)
(3663.0 3128.0 2643.0 2198.0 1784.0 1317.0 977.0 660.0 5... [/B]


理解了LISP表的概念后,还有更方便,高效的方法。

先分析下,你要求每个子表对应位置的最大值组成的表。

1、要把子表中对应位置的元素组成新的子表,然后用MAX函数求每个子表的最大值

2、根据1的分析,需要这么做:

   
  1. [font=courier](mapcar 'list 子表1 子表2 ... 子表n)[/font]
复制代码


      也就是想法构建一个这样的表:
   
   
  1. [font=courier](list 子表1 ... 子表n)[/font]
复制代码


       然后用apply 函数把mapcar 作用到上面的表求值。

所以代码可以先成:

  1. [font=courier]
  2. (setq a '(
  3. (4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 476.0)
  4. (3884.0 3275.0 2741.0 2262.0 1826.0 1339.0 990.0 666.0 476.0)
  5. (3663.0 3128.0 2643.0 2198.0 1784.0 1317.0 977.0 660.0 517.0)
  6. )'
  7. (setq b (cons (read "list") a))
  8. (setq c (mapcar '(lambda (x)(apply 'max x))  (apply 'mpcar b)))
  9. [/font]


测试结果:

c=(4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 517.0)

就两行代码就完成任务了。

LISP的精华部分和功能强大的地方就是表处理,而mapcar , apply 组合可以做出非常强大的功能来。mapcar 是对表的每个子表做函数的参数进行求值 , apply 是把一个符号添加到表头做函数求值表。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

发表于 2003-9-10 11:00:11 | 显示全部楼层
不愧为老大。分析的这么透测。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-9-10 23:24:30 | 显示全部楼层
最初由 tuger 发布
[B]不愧为老大。分析的这么透测。 [/B]


晓东的方法行了吗,我这出错.


  1. (setq a '(
  2. (4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 476.0)
  3. (3884.0 3275.0 2741.0 2262.0 1826.0 1339.0 990.0 666.0 476.0)
  4. (3663.0 3128.0 2643.0 2198.0 1784.0 1317.0 977.0 660.0 517.0)
  5. )
  6. )

  7. ;每次都取第一项,max一下.
  8. (while (caar a)
  9. (setq c(cons (apply 'max (mapcar 'car a)) c)
  10.         a(mapcar 'cdr a)
  11. ))
  12. (reverse c)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-9-10 23:53:23 | 显示全部楼层
最初由 aeo 发布
[B]

晓东的方法行了吗,我这出错.

[code]
(setq a '(
(4000.0 3366.0 2814.0 2322.0 1873.0 1375.0 1017.0 685.0 476.0)
(388... [/B]


上面代码我修正了,粗心完了一个表达式(apply 'mapcar b)

下面是分部做的:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-9-11 01:00:03 | 显示全部楼层
按你的写法:

  1. (setq b(cons (read "max") a)
  2.          b(apply 'mapcar b)
  3. )

不是更好?

我得好好想想,挺绕不过弯得.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-9-11 01:12:00 | 显示全部楼层
最初由 aeo 发布
[B]按你的写法:

  1. (setq b(cons (read "max") a)
  2.          b(apply 'mapcar b)
  3. )

不是更好?

我得好好想想,挺绕不过弯得. [/B]


:)

想好了,给大家贴出来吧,总之代码可以非常短就能得到结果的。
用MAPCAR,APPLY等等很多WHILE,RPEAT循环可以不用,效率更高。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-9-11 01:32:09 | 显示全部楼层
就是上面的:
(apply 'mapcar (cons (read"max")a))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-9-11 21:04:52 | 显示全部楼层
简直没有想到有这么简捷的语句!我得加紧练功,逻辑、算法等。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-9-11 23:44:49 | 显示全部楼层
最初由 hewb 发布
[B]简直没有想到有这么简捷的语句!我得加紧练功,逻辑、算法等。 [/B]


充分利用LISP的表处理,表头函数没有的就用 (cons (read "xxx") ll)添加进入表头。然后让它求值。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-5 03:20:46 | 显示全部楼层
(apply 'mapcar (cons 'max a))  就可以
另外也可以用
(apply 'mapcar (vl-list* 'max a))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 11:58 , Processed in 0.348104 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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