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))