找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 1553|回复: 3

ACSL专题-LISP

[复制链接]

9

主题

17

回帖

148

积分

超级版主

积分
148
发表于 2-14-2025 20:53:20 | 显示全部楼层 |阅读模式
本帖最后由 Shawn赵瑞翔 于 2-15-2025 08:50 编辑

近期查看真题,发现竟然忘了什么是LISP,什么CDR、CAR看不懂,觉得自己退化了连ACSL题目都看不懂 所以就研究了一下

1,什么是LISP
LISP是一种非常高端的语言,并且长期垄断了人工智能领域的应用,虽然非常古老,但是依旧走在科技前言
LISP是LIST Processing 的简称,由来自麻省理工学院的人工智能研究先驱John McCarthy在1958年基于λ演算所创造,采用抽象数据列表与递归作符号演算来衍生人工智能(这段是百度百科)


听起来,LISP非常的高深难懂,但是很明显,ACSL这类型的竞赛不会考到这么难的内核,只会让你看尽无数的括号..


2,ACSL在这个板块考什么
实际上,虽然ACSL叫这个板块叫LISP语言,但实际上是纸老虎,说白了就是让你看伪代码,看懂伪代码并且判断其输出
不同于常规的汇编伪代码,LISP看起来更难懂,但实际上更简单
在ACSL中出现的LISP伪代码基本上就是一行,比前后缀加减法还简单
一般出现的伪代码我们分成两类:1,运算   2,控制符


1,运算
例如:
(ADD (MULT 3 (EXP 2 3)) (MULT (EXP 2 2) (SUB (MULT 5 3) 6)) (EXP 2 (SUB (9 3))))


这就是一段LISP伪代码,不难看懂,ADD(加法),MULT(乘法),SUB(减法),EXP(次方),DIV(除法)
十分类似于前缀表达式,优先计算小括号内的运算,再进行第二层的运算,以此类推。在一个括号内,会包括:(运算符,a, b),例如(EXP, a, b)。
那么这个表达式的意思就是去运算a的b次方,a为底,b为幂。类似的,(SUB, a, b)指的就是a-b


例题:
(ADD (MULT 2 5) (EXP 3 2) (SUB 9 (ADD 1 7)) (DIV 15 3) (ADD 4 (SUB 8 4) 6))


【答案】39
【解析】(ADD (MULT 2 5) (EXP 3 2) (SUB 9 (ADD 1 7))(DIV 15 3) (ADD 4 (SUB 8 4) 6))
= (ADD 10 9 (SUB 9 8) 5 (ADD 4 4 6))
= (ADD 10 9 1 5 14)
= 39


2,控制符
这种符号会相对难理解一点,但仅限于一点
ACSL主要考到的控制符包括:CDR, CAR, REVERSE, SETQ
控制符不同于运算符,针对的对象不是数字,而是一个大LIST。通过控制符来更改list中元素的顺序,生成新list,删除list元素,选取元素等等,故只服务一个对象
类似于前面的运算符,控制符的表达方式是:(控制符(控制符(控制符(控制符(控制符(.....(一堆字母/数字表示变量))))))))
举个例子:
(CDR (CAR (CDR (REVERSE (CAR (CDR ‘(1 (2 ((3 4) 2) 3) 2 (4 (1 2)))))))))
注意,这个‘表示的是后面的所有内容是一个大的多层的list,而非控制符,我们解题的时候要从有'的地方开始解


现在来解释这些控制符
1 CAR:保留List中第一部分(可能为一个元素,也可能为一个子List)
例如:CAR(a, b, c)=(a)       CAR((a,b),(d,c),e,f)=(a,b)

2 CDR:去掉List中第一部分

例如:CDR(a, b, c)=(b, c)     CDR((a,b),(d,c),e,f)=((d,c),e,f)

3 REVERSE:把List中各个部分倒序输出

例如 REVERSE: (a,b,c)=(c,b,a)   REVERSE((a,b),(d,c),e,f)=(f,e,(d,c),(a,b))

4 SETQ: 赋值运算符,把一个变量赋值为一个List

其实这就是说我初始化设置,SETQ X = (a,b), 那么我在式子中的x就代表(a,b) (其实就是换元)


知道了这些,我们先来一起做一道例题
(CDR (CAR (CDR (REVERSE (CAR (CDR ‘(1 (2 ((3 4) 2) 3) 2 (4 (1 2)))))))))
注意到我们的初始list是(1 (2 ((3 4) 2) 3) 2 (4 (1 2))
第一层操作是CDR, 也就是将第一个元素,即1 删除,list变为:((2 ((3 4) 2) 3) 2 (4 (1 2))
接下来第二层操作是CAR,也就是只保留第一个元素,即整个子list (2 ((3 4) 2) 3)
第三层是REVERSE,将剩下的list倒序输出得到:(3 ((3 4) 2) 2)                                           注意:list中的子list里面不换顺序,将子list看做一个整体,一个元素来看
第四层是CDR,删除第一项,得到((3 4) 2) 2)
第五层是CAR,保留第一项,剩下((3 4) 2)
最后一层是CDR,删除第一项,也就得到了答案,即(2)。注意,答案以一个小list形式呈现


接下来,我们来小试牛刀
(REVERSE (CAR (CDR (CDR (CAR ‘((a b (c d)) (e (f g)) (h (j k))))))))


【答案】‘(d c)
【解析】(REVERSE (CAR (CDR (CDR (CAR ‘((a b (c d)) (e (f g)) (h (j k))))))))
= (REVERSE (CAR (CDR (CDR ‘(a b (c d))))))
= (REVERSE (CAR (CDR ‘(b (c d)))))
= (REVERSE (CAR ‘((c d))))
= (REVERSE ‘(c d))
= ‘(d c)




希望本帖对你有帮助:-)

9

主题

17

回帖

148

积分

超级版主

积分
148
 楼主| 发表于 2-14-2025 21:45:35 | 显示全部楼层
本帖最后由 Shawn赵瑞翔 于 2-15-2025 08:38 编辑

注意,比赛中可能会出现如
请计算下列 LISP 表达式:
(SETQ X '(1 2 (a (b) c) ((1 a) (2 b) c)))
(CDADDR X)
了解到这个CDADDR首末是C和R
那么中间的字符串每一个char都代表一个控制符,从右往左运算
(CDADDR X)指的是
(CDR (CAR (CDR (CDR X))))

6

主题

5

回帖

87

积分

超级版主

积分
87
发表于 2-14-2025 23:18:49 | 显示全部楼层
Shawn赵瑞翔 发表于 2-14-2025 21:45
注意,比赛中可能会出现如
请计算下列 LISP 表达式:
(SETQ X '(1 2 (a (b) c) ((1 a) (2 b) c)))

我记得CDADDR不是相当于CDR(CAR(CDR(CDR(东西))))吗 R应该不是reverse,C与R中间的一串AD相当于CAR和CDR吧.

9

主题

17

回帖

148

积分

超级版主

积分
148
 楼主| 发表于 2-15-2025 08:39:18 | 显示全部楼层
test123 发表于 2-14-2025 23:18
我记得CDADDR不是相当于CDR(CAR(CDR(CDR(东西))))吗 R应该不是reverse,C与R中间的一串AD相当于CAR和CDR ...

改了.. 你说的是对的,如果单独出现一个R是默认是Reverse但这里面显然不是
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 4-12-2025 09:43 , Processed in 0.064681 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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