- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试解决 LISP 上的问题,但我被这个问题困扰了很多天。
“编写一个名为 wheres-waldo 的函数,它以一个 lisp 对象(即从 conses 构建的数据结构)作为参数并返回一个 Lisp 表达式,该表达式从该对象中提取符号 waldo,如果它存在的话”
例如,
例如:(wheres-waldo '(emerson ralph waldo)) =
OUTPUT: (FIRST (REST (REST '(EMERSON RALPH WALDO))))
例如:(wheres-waldo '(mentor (ralph waldo emerson) (henry david thoreau))) =
OUTPUT: (FIRST (REST (FIRST (REST
'(MENTOR (RALPH WALDO EMERSON)
(HENRY DAVID THOREAU))))))
我已经写了一些递归,例如,
(defun wheres-waldo(lispOBJ)
(cond ((null lispOBJ) nil)
(equalp (first lispOBJ) waldo)
( t (***stuck here how to write recursion for this***))
)
我从 http://ai.eecs.umich.edu/people/wellman/courses/eecs492/f94/MP1.html 找到了这个问题wheres-waldo.任何帮助,将不胜感激。谢谢。
最佳答案
您需要遍历一个列表,如果一个元素是一个列表,则递归到子列表中,就像您实现深度搜索一样。唯一的区别是,为了产生所需的输出,您需要执行 s-expression 回溯您用于到达那里的函数。
这是一种可能的实现方式。请注意,我使用了更传统的 car
和 cdr
而不是 first
和 rest
- 它们是等价的。
(defun whereis (who obj &optional (sexp (list 'quote obj)))
(cond
; we found the object - return the s-expr
((eq obj who) sexp)
; try car and the cdr
((and obj (listp obj))
(or (whereis who (car obj) (list 'car sexp))
(whereis who (cdr obj) (list 'cdr sexp))))))
然后:
? (whereis 'waldo '(emerson ralph waldo))
(CAR (CDR (CDR '(EMERSON RALPH WALDO))))
? (whereis 'waldo '(mentor (ralph waldo emerson) (henry david thoreau)))
(CAR (CDR (CAR (CDR '(MENTOR (RALPH WALDO EMERSON) (HENRY DAVID THOREAU))))))
? (whereis 'thoreau '(mentor (ralph waldo emerson) (henry david thoreau)))
(CAR (CDR (CDR (CAR (CDR (CDR '(MENTOR (RALPH WALDO EMERSON) (HENRY DAVID THOREAU))))))))
? (whereis 'scotty '(beam me up . scotty))
(CDR (CDR (CDR '(BEAM ME UP . SCOTTY))))
? (whereis 'waldo '(emerson ralph))
NIL
如果您的元素可以出现多次,您还可以构建一个结果列表:
? (whereis 'c '(a b c d c b a))
((CAR (CDR (CDR '(A B C D C B A)))) (CAR (CDR (CDR (CDR (CDR '(A B C D C B A)))))))
使用此代码:
(defun whereis (who obj)
(let ((res nil)) ; the final result
(labels
; sub-function: walks the whole list recursively
((sub (obj sexp)
; found it - add to result list
(when (eq obj who) (setf res (cons sexp res)))
; try car and cdr
(when (and obj (listp obj))
(sub (cdr obj) (list 'cdr sexp))
(sub (car obj) (list 'car sexp)))))
; call sub-function
(sub obj (list 'quote obj)))
res))
关于recursion - LISP 中的 wheres-waldo 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21958502/
我想选择名称为xxx,品牌为xxx的单条记录(整条记录)。记录将始终是单数的,因为名称和品牌是唯一索引: def getProductByNameAndBrand(name, brand) do
这没有意义。 Sequelize 创建了一个以 AND 而不是 WHERE 开头的 where 条件。 我正在尝试执行此查询: var query = { limit: 10,
请记住以下两种类型的查询: --query1 Select someFields From someTables Where someWhereClues Union all Select someF
我有一个名为 Students 的列的表。 我对 select 行使用以下三个查询。 1. select * from Students 2. select * from Students whe
哪种选择语句更好? SELECT * FROM aTable WHERE aField in ( SELECT xField FROM bTable WHERE yFi
我有 table DROP TABLE IF EXISTS `slug`; CREATE TABLE `slug` ( `slug` varchar(255) NOT NULL, `id` i
我正在努力从 swift 数组中删除一个项目,但我不确定为什么会收到此错误。 我的代码是: var itemToRemove = list[indexPath.item] selectedCasesA
我想根据对表 B 的 true 或 false 选择获取表 A 中的一些行。 表A id event name 4585 meeting calendar discussion 表
有一个如下所示的 mysql Person 表。 id 是主要的,有索引的。但其他列没有索引.. id name surname age
我有一个相对简单的查询,它返回用户个人资料以及与该用户相关的 2 个计数(流事件和库存); SELECT u.*, r.regionName, COUNT(i.fmid) AS invcount, C
我有一个名为“ friend ”的表,您可以在下面看到。有两列 userId 和friendId,它们都不是主键。每次我向表中插入数据时,都会添加 2 行。我希望能够在插入之前检查至少一行是否已存在,
我需要一种方法来遍历数据库并返回适当的结果。在本例中,它按作者、标题、出版日期或 ISBN 代码搜索书籍。我决定使用 where() 方法,但我遇到了两个问题: 1) 我无法通过多个字段进行搜索。很容
我试图通过每 24 小时仅插入唯一值来跟踪页面 View 。但是当我运行此查询时,出现语法错误。 insert ignore into profilepageviews values( '77.777
我有以下查询: select sites.denomination, rooms.floor, rooms.number, (count(beds.id) - sum(if(beds.state<0,
我正在尝试动态构建一个表达式树,它使用 in 查询有效地查询数据源。我要复制的查询是 Countries.Where(y => Countries .
我正在使用 laravel 5.7 当我使用 whereHas 检查关系是否存在时,我遇到了 Unknown column "has"in 'where clause 错误!为什么? 这是我的代码:
我正在处理我同事的旧项目,我在她的代码中找到了 WHERE TRUE AND ID='1' AND STAT='1'。我试图删除 TRUE AND,因此查询变为 WHERE ID='1' AND ST
我有一张 table ,它看起来像: +-----------+----------+ + person_id + group_id + +-----------+----------+ + 1
我有一个这样的数组: array = np.array([ [True, False], [True, False], [True, False],
这可能很明显,但我感到非常困惑。 我有一个带where子句(带参数列表的where)的SQL查询。如果所有这些参数都为null,则需要SQL忽略where子句并检索所有记录。这在SQL中容易做到吗?我
我是一名优秀的程序员,十分优秀!