乐筑天下

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

[编程交流] 更容易递归地构建

[复制链接]

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:19:52 | 显示全部楼层 |阅读模式
这不是我第一次尝试,但我总是设法找到另一条路线。这次我不想要任何“硬编码的替代品”,所以。。。请跟我谈谈。我从一个类似于ssnamex的选择部分的列表中选择(因此其长度可以变化)
由于列表的长度可能不同,我认为“递归”,但fast发现,虽然递归构建有点简单,但递归解构似乎完全是另一回事。(可以做到吗?)
到目前为止,我的最佳尝试是删除所有不是坐标的内容,但列表结构与原始列表相同,如下所示
  1. ;Not quite there yet!
  2. (defun keepcoords (L)
  3.    (if (listp L)
  4.        (if (and (atom (car L))
  5.                 (atom (cadr L))
  6.                 (atom (caddr L))
  7.            )
  8.            L
  9.            (mapcar '(lambda (x)
  10.                       (keepcoords x)
  11.                     )
  12.                    L
  13.            )
  14.        )
  15.    )
  16. )
  17. ;returns that....
  18. ((nil (nil (269.157 85.9418 0.0)) (nil (272.343 85.9418 0.0)) (nil (272.343 59.9463 0.0)) (nil (269.157 59.9463 0.0)))
  19.   (nil (nil (273.021 84.9263 0.0)) (nil (274.851 84.9263 0.0)) (nil (274.851 83.3016 0.0)) (nil (273.021 83.3016 0.0)))
  20.   (nil (nil (275.258 65.4297 0.0)) (nil (279.528 65.4297 0.0)) (nil (279.528 60.6233 0.0)) (nil (275.258 60.6233 0.0)))
  21.   (nil (nil (280.206 72.2671 0.0)) (nil (283.596 72.2671 0.0)) (nil (283.596 69.5592 0.0)) (nil (280.206 69.5592 0.0))))

我需要的是得到一个只包含坐标的列表,就像这样
我知道我可以“硬编码”一个解决方案,该解决方案适用于(并且仅适用于)这种特定类型的列表,但我在这里的目标是制作一个函数,该函数可以只提取任意长度和形态的列表的点坐标,递归似乎是实现它的唯一途径。我可怜的大脑现在坏了。我需要一些新的观点。请解开我的大脑
141956yebab1p9ha1yq3ky.png
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:23:31 | 显示全部楼层
啊,我可能忘了提到其他任意决定的标准,例如“只有一个函数”和“没有子函数”。。因为
 
  1. (defun keepcoords ( L / helper ret)
  2.   (defun helper ( L )
  3.     (if (listp L)
  4.        (if (and (atom (car L))
  5.                 (numberp (car L))
  6.                 (atom (cadr L))
  7.                 (numberp (cadr L))
  8.                 (atom (caddr L))
  9.                 (numberp (caddr L))
  10.                 (= 3 (length L))
  11.            )
  12.            (setq ret (cons L ret));L
  13.            (mapcar '(lambda (x)
  14.                       (helper x)
  15.                     )
  16.                    L
  17.            )
  18.        )
  19.    )
  20.   )
  21.   (helper L)
  22.   ret
  23. )
似乎不如简单的建筑递归优雅。但它是有效的。尽管如此,如果你能找到一种在单个功能中实现它的方法,请随时发布。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 13:29:06 | 显示全部楼层
也许是这样?
  1. (defun coords ( lst )
  2.     (if (and lst (listp lst))
  3.         (if (and (< 1 (length lst) 4) (vl-every 'numberp lst))
  4.             (list lst)
  5.             (append (coords (car lst)) (coords (cdr lst)))
  6.         )
  7.     )
  8. )
回复

使用道具 举报

28

主题

317

帖子

292

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
140
发表于 2022-7-5 13:32:24 | 显示全部楼层
啊!对!我的一次尝试非常接近于此,但并没有将坐标保持在列表中,而是将它们展平到一个列表中,因为我返回的是lst而不是(list lst)。我总是尽量避免使用append,显然我甚至不知道如何正确使用它。这是我的
一旦有人睁开眼睛,我们所看到的一切都是疯狂的。您的“(and lst(listp lst))”很好地提醒了我们,(listp nil)返回T,这解释了为什么在我疯狂使用嵌套的ifs、mapcars、lambdas、子函数和局部变量之前,我试图修改append版本时出现了一些内部堆栈限制问题。正如谚语所说:“我们活着,读书,学习。”
谢谢李!
编辑:为(<1(长度lst)4)&(vl every’numberp lst)致敬。比我做的更优雅。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 13:35:42 | 显示全部楼层
上述检查等于(vl consp lst)

  1. (defun f ( L )
  2.   (cond
  3.     ( (atom L) nil)
  4.     ( (append (f (car L)) (f (cdr L))) )
  5.     ( (and (= 3 (length L)) (vl-every 'numberp L)) (list L) )
  6.   )
  7. )
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 13:38:08 | 显示全部楼层
另一个
  1. (defun coords (lst)
  2.   (apply 'append
  3.     (mapcar
  4.      '(lambda (x)
  5.         (cond
  6.           ((atom x) nil)
  7.           ((vl-every 'numberp x) (list x))
  8.           ((coords x))
  9.         )
  10.       )
  11.       lst
  12.     )
  13.   )
  14. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 13:41:25 | 显示全部楼层
我喜欢你的,斯特凡。。但我会替换这部分
  1. (mapcar
  2.   ...
  3.   lst
  4. )

所以它不会在像这样的东西上破裂
  1. 12

但我同意我的挑剔是一个人的意见,因为有些子操作在没有自我输入检查的情况下仍然被接受。
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 13:44:54 | 显示全部楼层
仅适用于列表结构-无递归
  1. 13
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 13:47:40 | 显示全部楼层
是,(坐标1)将出错。。。但是,如果lst是一个原子,那么像(mapcar…lst)这样的每个构造都将失败。你每次都检查这个吗?其他功能呢?每次使用+函数时,是否需要检查每个参数?
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 13:49:52 | 显示全部楼层
我只在我的子函数(尤其是大函数)上执行此操作,而不是在内置的lisp函数上。就像我说的,这是一种个人观点,它会减慢整个例程,当子对象递归时,它会急剧减慢。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-15 07:26 , Processed in 0.405995 second(s), 75 queries .

© 2020-2025 乐筑天下

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