乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 51|回复: 8

[编程交流] 关于“应用”的问题

[复制链接]

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:15:17 | 显示全部楼层 |阅读模式
大家好。
我有一个关于“应用”和“地图车”的问题。
 
请查看以下代码:
  1. (setq b '((0 1 2) (3 4 5) (6 7 ))
  2. (apply 'mapcar (cons 'list b))

它返回:((0 3 6)(1 4 7)(2 5 8))
 
它是如何工作的?
 
 
下一个问题:
  1. (setq a '(1 2 3 4 5 6 7 8 9 0))
  2. (apply 'mapcar (cons 'list (list a (cdr a))))

它返回:((1 2)(2 3)(3 4)(4 5)(5 6)(6 7)(7 8)(8 9)(9 0))
 
它是如何工作的?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:29:33 | 显示全部楼层
欢迎来到CADTutor。
 
希望我能像你一样清楚地描述它们
 
第一个函数apply在列表上实现mapcar函数,mapcar函数迭代每个列表的每个元素,并使用cons和list函数将它们收集在列表中。
 
第二个问题是使用apply函数实现mapcar函数,分别获得列表的第一项和第二项,我可以以递归方式将其作为替代函数提供给您。
 
测试上述功能:
 
  1. (_list '(1 2 3 4 5 6 7 8 9 0))
  2. [color=red];; Returns [/color]
  3. ((1 2) (2 3) (3 4) (4 5) (5 6) (6 7) (7  (8 9) (9 0))
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:35:27 | 显示全部楼层
谢谢你,塔瓦先生!
 
但我仍然对一些细节感到困惑。
第一
我和foreach一样知道mapcar函数。在代码1中,为什么下一个值是“3”而不是“1”?
请看其他示例:
  1. (setq lst '((3 4 5) (0 1 2) (6 7 ))
  2. (apply 'mapcar (cons 'min lst))

结果显示(0 1 2)
为什么不是(3 0 6)?
 
 
第二
为什么要在列表的前面添加列表(使用apostrope表示不执行),而使用apply可以收集列表?
 
谢谢
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:40:56 | 显示全部楼层
 
因为mapcar函数首先遍历目标列表的每个第一个元素,然后遍历第二个元素,最后遍历第三个元素。。。。直到最后。
 
因为目标列表的最小值由三个元素组成,结果是三个元素,包括最小值。
 
 
mapcar函数需要的是,第一个apply函数需要一个函数作为第一个参数,然后mapcar函数也需要一个函数作为第一个参数。
 
我很高兴你的问题,因为这也刷新了我对前面提到的函数的记忆
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 20:46:47 | 显示全部楼层
谢谢你!
经过你的解释,我已经清楚地了解了那些功能!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 20:54:21 | 显示全部楼层
 
很高兴听到这个消息,非常欢迎你。
 
继续练习函数以熟悉它们,如果有一天你注意到某个函数做了比你更重要的事情,不要感到惊讶或恐慌
用于查看或了解示例一是entdel函数。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 21:03:25 | 显示全部楼层
 
考虑一下:
  1. (apply 'mapcar (cons 'list '((0 1 2) (3 4 5) (6 7 )))
与:
  1. (mapcar 'list '(0 1 2) '(3 4 5) '(6 7 )
其评估方式与:
  1. (list (list 0 3 6) (list 1 4 7) (list 2 5 )

返回:
  1. ((0 3 6) (1 4 7) (2 5 )
回复

使用道具 举报

1

主题

4

帖子

3

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 21:13:50 | 显示全部楼层
也谢谢你,李先生!
 
我试了另一个例子,真的很神奇。
但是为什么要使用apply和mapcar,为什么不只是使用mapcar?
这有什么原因吗?快得多?
 
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 21:22:40 | 显示全部楼层
 
不客气!
 
 
所需的函数取决于输入数据的格式、要执行的操作以及返回的列表所需的格式-在您的特定示例中,如果三个元素的每个列表嵌套在父列表中,则该列表将作为单个参数提供给mapcar,并且不会返回相同的结果:
  1. _$ (mapcar 'list '((0 1 2) (3 4 5) (6 7 ))
  2. (((0 1 2)) ((3 4 5)) ((6 7 ))

因此,应用函数用于构造等价于以下内容的表达式:
  1. (mapcar 'list '(0 1 2) '(3 4 5) '(6 7 )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 08:57 , Processed in 0.657988 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表