Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 方案-截断列表_List_Scheme - Fatal编程技术网

List 方案-截断列表

List 方案-截断列表,list,scheme,List,Scheme,我不熟悉这个计划。我试图截断列表,使新列表不包含第一个和最后一个元素 提前感谢。有很多方法可以做到这一点,一种可能是使用删除最后一个元素和(或cdr)删除第一个元素: (define lst '(1 2 3 4 5)) (rest (drop-right lst 1)) => '(2 3 4) 如果您的解释器中没有drop right,则只需执行一个过程,返回一个包含输入列表中所有元素(最后一个除外)的新列表。您甚至可以在一个过程中同时删除这两个元素。下面是解决方案的总体思路,假设列表中

我不熟悉这个计划。我试图截断列表,使新列表不包含第一个和最后一个元素


提前感谢。

有很多方法可以做到这一点,一种可能是使用删除最后一个元素和(或
cdr
)删除第一个元素:

(define lst '(1 2 3 4 5))
(rest (drop-right lst 1))
=> '(2 3 4)
如果您的解释器中没有
drop right
,则只需执行一个过程,返回一个包含输入列表中所有元素(最后一个除外)的新列表。您甚至可以在一个过程中同时删除这两个元素。下面是解决方案的总体思路,假设列表中至少有两个元素(否则会出现错误)-请填写以下空白:

(define (truncate-first-last lst)
  (define (drop-last lst)          ; helper procedure for removing last element
    (if <???>                      ; if the rest of the list is empty
        <???>                      ; then return the empty list
        (cons <???>                ; else `cons` the first element
              (drop-last <???>)))) ; and advance the recursion
  (drop-last <???>))               ; call helper, remove first element from list

有很多方法可以做到这一点,一种可能是使用删除最后一个元素和(或
cdr
)删除第一个元素:

(define lst '(1 2 3 4 5))
(rest (drop-right lst 1))
=> '(2 3 4)
如果您的解释器中没有
drop right
,则只需执行一个过程,返回一个包含输入列表中所有元素(最后一个除外)的新列表。您甚至可以在一个过程中同时删除这两个元素。下面是解决方案的总体思路,假设列表中至少有两个元素(否则会出现错误)-请填写以下空白:

(define (truncate-first-last lst)
  (define (drop-last lst)          ; helper procedure for removing last element
    (if <???>                      ; if the rest of the list is empty
        <???>                      ; then return the empty list
        (cons <???>                ; else `cons` the first element
              (drop-last <???>)))) ; and advance the recursion
  (drop-last <???>))               ; call helper, remove first element from list

你可以这样做:

(define (compose f1 . fn)
  (cond ((null? fn) f1)
        (else (let ((fr (apply compose fn)))
                (lambda (x) (f1 (fr x)))))))


(define truncate-first-last (compose reverse cdr reverse cdr))

> (truncate-first-last '(1 2 3 4))
(2 3)

你可以这样做:

(define (compose f1 . fn)
  (cond ((null? fn) f1)
        (else (let ((fr (apply compose fn)))
                (lambda (x) (f1 (fr x)))))))


(define truncate-first-last (compose reverse cdr reverse cdr))

> (truncate-first-last '(1 2 3 4))
(2 3)

使用
cdr
(如上所述)代替
rest
。至于
drop right
,正如最后一段所暗示的,实现一个
drop last
过程,很简单:只需在创建新列表的同时遍历输入列表(使用教科书中提供的用于此类操作的模板),唯一不同的是,递归在列表的
cdr
null?
时结束,而不是在列表为
null?
时结束,这通常是caseLopez-您在这里引用的教科书我假设您编写此过程是作为编程课程的一部分。如果它不是一本教科书,那么书,网页,笔记,或任何其他材料,你正在使用作为参考。我想说的是:这是一个相当标准的程序,所以用来解决它的技术一定是通过某种方式教给你的Hanks@Lopez提供了很好的指导..在你的建议下,我实现了它,它起了作用:)太好了!只是几个改进:在
cond
表单中,最后一个子句是
else
(Scheme方式),而不是
#t
(公共Lisp方式)。而
追加
是不必要的,
trunc fl
的主体只是
(最后一次放置(cdr lst))
而不是
rest
使用
cdr
(如上所述)。至于
drop right
,正如最后一段所暗示的,实现一个
drop last
过程,很简单:只需在创建新列表的同时遍历输入列表(使用教科书中提供的用于此类操作的模板),唯一不同的是,递归在列表的
cdr
null?
时结束,而不是在列表为
null?
时结束,这通常是caseLopez-您在这里引用的教科书我假设您编写此过程是作为编程课程的一部分。如果它不是一本教科书,那么书,网页,笔记,或任何其他材料,你正在使用作为参考。我想说的是:这是一个相当标准的程序,所以用来解决它的技术一定是通过某种方式教给你的Hanks@Lopez提供了很好的指导..在你的建议下,我实现了它,它起了作用:)太好了!只是几个改进:在
cond
表单中,最后一个子句是
else
(Scheme方式),而不是
#t
(公共Lisp方式)。而
追加
是不必要的,
trunc fl
的主体只是
(drop last(cdr lst))