我尝试使用递归函数通过使用 car/cdr 函数的组合来从列表列表中返回对。
y 是一个空列表,它将存储 ev-lst 中的对,然后返回到控制台,ev-lst 是我将用来访问这些对的列表列表。 ev-lst 中的每个子列表的格式为:(整数、整数、对)
从第一个到倒数第二个子列表,程序应在该特定迭代中将“第一个”子列表中的对附加到 y。
之后,它应该将其余的子列表作为参数传递给函数,以便它再次迭代。当它完成最终迭代时,每个迭代的 y 将被返回,然后附加到前一个迭代的 y 直到到达末尾,此时最终 y 将与所有对一起返回到控制台。
当只剩下 1 个子列表时,使用不同的 car/cdr 函数来访问该对并返回它,但这会产生一个错误,表明已违反合同。我尝试更改 car/cdr 功能,但不幸的是它产生了相同的结果。我不知道如何解决它。
代码是:
(define (event-params-lst ev-lst)
(let ((y (list '() )))
(if (< 1 (length ev-lst))
(append y (cddar ev-lst)
append y (event-params-lst (cdr ev-lst)))
(
(caddr ev-lst)
)
)
(y))
)
从你的描述中很难理解预期的结果是什么。
我认为主要问题是您正在考虑循环和突变,就好像您正在使用其他语言进行编程,其中这些是基本构建块,并且您正在描述该代码而不是它想要解决的问题解决。
但是,听起来您的实际问题是从三元组列表的每个元素中提取第三个元素。
也就是说,
((a b c) (d e f) (g h i) ...) --> (c f i ...)
这只是
(define (event-params-lst ev-lst)
(map caddr ev-lst))
或者,在 Racket 中并且更具可读性,
(define (event-params-lst ev-lst)
(map third ev-lst))