gpt4 book ai didi

lisp - 可以选择列表的第 n 个项的方案函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:55 25 4
gpt4 key购买 nike

所以这里我有几个我想使用的定义列表:

(DEFINE list0 (LIST 'j 'k 'l 'm 'n 'o 'j) )
(DEFINE list1 (LIST 'a 'b 'c 'd 'e 'f 'g) )
(DEFINE list2 (LIST 's 't 'u 'v 'w 'x 'y 'z) )
(DEFINE list3 (LIST 'j 'k 'l 'm 'l 'k 'j) )
(DEFINE list4 (LIST 'n 'o 'p 'q 'q 'p 'o 'n) )
(DEFINE list5 '( (a b) c (d e d) c (a b) ) )
(DEFINE list6 '( (h i) (j k) l (m n) ) )
(DEFINE list7 (f (a b) c (d e d) (b a) f) )

我想做的是为一个“中间”函数创建一个递归函数,它会这样做:

中间:(middle 1st) 应该返回一个单元素列表,只包含第一个的中间元素[或者如果第一个中有偶数个元素,则返回空列表]。也就是说,

(中间'(a b c d e f g))应该/将返回:(d)

(中间'(s t u v w x y z))应该/将返回空字符串。

(中间'( (a b) c (d e d) c (b a) ) )应该/将返回:( (d e d) )请注意,( (d e d) ) 是一个列表,其中包含位于中间的内容,它恰好本身就是一个列表。

我想我必须把它分成两个问题。首先是我需要一个可以选择列表第 n 项的函数。我对创建它知之甚少。其次,您需要一个函数来确定中间项的位置以及是否存在中间项。 (我对如何创建它也知之甚少。然后

(define middle
(lambda (L)
(if (middle? L)
(nth-term (middle L) L)
'())))

这是我的 evens 函数,我想知道是否有更简单的方法:

(define evens
(lambda (L)
(if (or (NULL? (cddr L)))
'()
(cons (cadr L) (evens (cddr L))))))

最佳答案

最简单的方法是使用 length 函数获取列表的长度,然后确保长度不是偶数(如果是,则返回一个空列表)。一旦我们知道长度是奇数,就返回列表中长度为列表长度减一的元素。结果在列表的中间。这是代码的实际样子:

    (define (middle lis)
(let ((list-length (length lis)))
(if (even? list-length)
'()
(list (list-ref lis (/ (- list-length 1) 2))))))

要回答主题行中的问题,您需要使用 list-ref 过程获得列表的第 n 项,如下所示:

    > (list-ref '(a b c d) 2)
'c

如果您还有什么不明白的地方,请告诉我,我会尽力澄清。

关于lisp - 可以选择列表的第 n 个项的方案函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com