Functional programming 如何获取列表方案中的元素范围?

Functional programming 如何获取列表方案中的元素范围?,functional-programming,scheme,Functional Programming,Scheme,因此,目前,我有以下清单: '(1 2 3 4 5 6) 在给定开始和结束索引的情况下,如何获取子列表? 所以,输入[1:3]返回一个值为“(2 3 4)的列表。您需要编写自己的过程,以便在普通的旧方案中执行此操作。以下两种解决方案均可在R4RS、R5RS、R6RS或R7RS标准方案中使用 递归解 递归解决方案可以将列表xs和两个索引A和b作为参数。如果a和b相等,则应返回空列表'()。如果a为零,则列表的第一个元素应consed到子列表的其余部分。否则,应返回剩余xs的子列表,其中a和b

因此,目前,我有以下清单:

'(1 2 3 4 5 6)
在给定开始和结束索引的情况下,如何获取子列表?
所以,输入[1:3]返回一个值为“(2 3 4)的列表。

您需要编写自己的过程,以便在普通的旧方案中执行此操作。以下两种解决方案均可在R4RS、R5RS、R6RS或R7RS标准方案中使用


递归解
递归解决方案可以将列表
xs
和两个索引
A
b
作为参数。如果
a
b
相等,则应返回空列表
'()
。如果
a
为零,则列表的第一个元素应
cons
ed到子列表的其余部分。否则,应返回剩余
xs
的子列表,其中
a
b
减少了一

(define (sublist xs a b)
  (cond ((= a b) '())
        ((zero? a)
         (cons (car xs) (sublist (cdr xs) a (- b 1))))
        (else
         (sublist (cdr xs) (- a 1) (- b 1)))))
>(子列表“(123456)13)
(2 3)
请注意,当
a
为零时,列表
xs
的第一个元素将保留(添加到结果子列表中),但在这种情况下,必须减少范围的最后一个索引,因为工作列表已从前面缩短。不过,我们仍然需要新工作列表中0索引的子列表

类似地,当
a
还不是零时,列表的第一个元素被丢弃,并且对缩短的工作列表调用
子列表
;在这种情况下,必须减少
a
b

还要注意的是,该代码没有对输入进行验证;也就是说,此过程假定提供了有效的输入。如果
a
b
超出范围,或者
b
a将出现问题


使用内置列表过程的解决方案
另一种方法可以使用内置程序
列表尾部
反向
。首先,辅助程序将非常有用:

(define (dropr xs n)
  (reverse (list-tail (reverse xs) n)))
此过程从输入列表中删除最右边的
n
元素。请注意,内置的
list tail
过程返回其输入列表,其中删除了第一个
k
元素

现在可以组合
drop
list tail
来生成
子列表-2

(define (sublist-2 xs a b)
  (list-tail (dropr xs (- (length xs) b)) a))
这里,
list tail
删除输入列表的第一个
a
元素,而
drop
从列表中删除最后一个
l-b
元素,其中
l
是列表的长度

输出如前所述:

>(子列表-2'(123456)13)
(2 3)
中有两个内置函数,
列表头
列表尾
。你可以用它们来做例子

(list-head (list-tail lst start) (- end start))
所以

结果为
”(23)

显然,如果参数没有意义,您将得到一个错误

作为一项功能:

(define (sublist lst start end)
    (list-head (list-tail lst start) (- end start)))

您只需要第二个和第三个元素,还是要指定输入列表的子列表?如果是这样的话,您想如何指定子列表:按索引、按第一个索引和元素数…?我刚才看到您在我写答案时更改了要求;当心点就好了。IAC,您确定这就是您要指定子列表的方式吗?不同的工作方式是很常见的;e、 例如,在Python中,切片[1:3]将为您提供索引1和2处的元素,而不是索引3处的元素。
(define (sublist lst start end)
    (list-head (list-tail lst start) (- end start)))