Lisp 可以选择列表第n项的Scheme函数

Lisp 可以选择列表第n项的Scheme函数,lisp,scheme,Lisp,Scheme,因此,这里有两个我想使用的已定义列表: (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) ) (DEF

因此,这里有两个我想使用的已定义列表:

(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) )
我想做的是为一个“中间”函数创建一个递归函数,该函数的作用如下:

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

(中间(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)))
应/将返回:
((ded))
注意,<代码>((d e d))< /C>是包含中间内容的列表,它本身是一个列表。

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

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

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

最简单的方法是使用length函数获取列表的长度,然后确保长度不是偶数(如果是,则返回空列表)。一旦我们知道长度是奇数,返回列表的元素,该元素是列表长度的一半减去1。结果是列表的中间部分。下面是代码的实际外观:

    (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

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

答案可以改进如下:

(define (middle lst)
  (let ((len (length lst)))
    (if (even? len)
        '()
        (list (list-ref lst (quotient len 2))))))
请注意,有一种更简单的方法可以获得中间元素的索引。

显而易见的方法(计算长度;除以2;查找列表)需要两次遍历列表

以下是一个仅需一次通过的备选方案:

(define (middle lst)
  (letrec
    ((middle-odd
       (lambda (x y) (if (null? x) (list (car y)) (middle-even (cdr x) (cdr y)))))
     (middle-even
       (lambda (x y) (if (null? x) '() (middle-odd (cdr x) y)))))
    (middle-even lst lst)))

谢谢你,在你的解释之后,我真的可以看到一切是如何安排的。有一件事我看到你说有一种更简单的方法来创建一个中间函数,你认为我的evens函数是好的还是可能有一种更简单的方法来实现这一点,我在最后的前一个问题中发布了它。an
nth
函数将比
middle
函数更通用。@AlexejMagura问题是关于
middle
,无论如何,它使用
list ref
“n”函数。
(define (middle lst)
  (letrec
    ((middle-odd
       (lambda (x y) (if (null? x) (list (car y)) (middle-even (cdr x) (cdr y)))))
     (middle-even
       (lambda (x y) (if (null? x) '() (middle-odd (cdr x) y)))))
    (middle-even lst lst)))