明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2266|回复: 10

[提问] 新手求助,关于表运算求值的问题

[复制链接]
发表于 2013-10-24 21:53:00 | 显示全部楼层 |阅读模式
我有表1:(1 2 3 4 5 6 7 8 9)
       表2:(2 3  4)
       表1的元素比表2的元素要多,现在想用表2中的元素与表1中对应的元素相乘(2X1  3X2  4X3),然后再与剩下来的元素再次相乘(2X4  3X5  4X6  2X7  3X8  4X9),将运算之后得到的新值赋于表3(2 6 12 8 15 24 14 24 36),程式应该怎么写?
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-10-25 09:40:38 | 显示全部楼层

  1. (setq i 0 n 0 b1 (list 1 2 3 4 5 6 7 8 9) b2 (list 2 3 4) b3 '() b4 '())
  2. (repeat (/ (length b1) (length b2))
  3.   (setq b4 (append b2 b4))
  4. )
  5. (setq b3 (mapcar '* b1 b4))
  6. (print b3)

  7. ;or


  8. (setq i 0 n 0 b1 (list 1 2 3 4 5 6 7 8 9) b2 (list 2 3 4) b3 '())
  9. (repeat (/ (length b1) (length b2))
  10.   (setq n 0)
  11.   (repeat (length b2)
  12.     (setq b3 (cons (* (nth i b1) (nth n b2)) b3))
  13.     (setq n (1+ n))
  14.     (setq i (1+ i))
  15. )
  16. )
  17. (setq b3 (reverse b3))
  18. (print b3)
发表于 2013-10-25 09:51:18 | 显示全部楼层
(setq l1 '(1 2 3 4 5 6 7 8 9))
(setq l2 '(2 3 4))
(setq l3 (append l2 l2 l2))
(mapcar '* l1 l3)
发表于 2013-10-25 10:12:04 | 显示全部楼层
  1. ;; (aaa '(1 2 3 4 5 6 7 8 9 10) '(1 2 3 4 5))
  2. (defun aaa (lst1 lst2 / i n)
  3.   (setq        i -1
  4.         n (length lst2)
  5.   )
  6.   (mapcar '(lambda (x)
  7.              (setq i (1+ i))
  8.              (* x (nth (rem i n) lst2))
  9.            )
  10.           lst1
  11.   )
  12. )
 楼主| 发表于 2013-10-25 22:02:14 | 显示全部楼层
谢谢三位大师,但是前面两位大师的程式只有在表1元素个数能被表2元素个数整除时,才能得出正确的结果,如果表1不能被表2整除,就不适用了。xpy1964大师的函数测试通过,对三位大师的热心帮助表示感谢!
 楼主| 发表于 2013-10-25 22:31:31 | 显示全部楼层
xyp1964 发表于 2013-10-25 10:12

谢谢xyp1964版主,您写的函数正好符合我的需要。想再请版主帮忙,如果现在再增加一个表3,例如:
表1:(1 2 3 4 5 6 7 8 9 10)
表2:(2 3 4 5 6 7)
表3:(8 9 10)
运算规则是:先还是用表1和表2前两个数对应相乘(1X2  2X3),然后表1、表2的三个数和表3的三个数对应相乘(3X4X8  4X5X9  5X6X10),然后表1接下来的数再和表2接下来的数对应相乘(6X7  7X2),如果表2中的数用完了就从头再循环,然后表1、表2、表3接下来的数再对应相乘(8X3X8  9X4X9  10X5X10),如此循环……
请教版主,有办法写这样的一个函数吗?

点评

弯弯绕……  发表于 2013-10-25 23:50
发表于 2013-10-26 07:11:16 | 显示全部楼层
你可以重排表嗎?以不變應萬變
 楼主| 发表于 2013-10-26 10:07:47 | 显示全部楼层
lsjj 发表于 2013-10-26 07:11
你可以重排表嗎?以不變應萬變

高手可以赐教吗?我刚学LISP不久,对LISP函数还不是很熟练,目前只能用xyp1964版主的函数稍做修改:
(defun aaa (lst1 lst2 lst3 / i n)
  (setq i -1
        n (length lst2)
  )
  (mapcar '(lambda (x)
             (setq i (1+ i))
             (* x (nth (rem i n) lst2) (nth (rem i n) lst3))
           )
           lst1
  )
)
然后把我的表3变化成(1 1 8 9 10 1),这样就能勉强通过,但这样显然是不科学的,如果表2的个数有变化,那表3也要跟着变,不能算真正解决问题,还请高手们指点迷津。谢谢!
发表于 2013-10-26 13:09:00 | 显示全部楼层
不用改xpy1964版主的程序,循環套用即可
axbxc=(axb)xc
 楼主| 发表于 2013-10-26 15:09:55 | 显示全部楼层
lsjj 发表于 2013-10-26 13:09
不用改xpy1964版主的程序,循環套用即可
axbxc=(axb)xc

谢谢,如果不修改程序的话,应该行不通,因为三个表两两之间的运算规则不一样,表1和表2是从第1个数开始对应相乘,当表2的数不够时再从第一个数开始循环,直到与表1的个数相等时停止;而表3是与表1、表2的第3个数开始对应相乘,然后再间隔2个数,再与表1、表2的第8个数相乘,如果是(aXb)Xc的话,就变成表3和表2一样,一直在循环了,中间没有隔开两个数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-26 06:11 , Processed in 0.172821 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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