Scheme 在DrRacket中获取列表中的最后n个元素,不带list ref

Scheme 在DrRacket中获取列表中的最后n个元素,不带list ref,scheme,racket,Scheme,Racket,我知道如何获取列表中的第一个n元素 (define (countup n ls) (cond [(zero? n) '()] [else (cons (first ls) (countup (sub1 n) (rest ls)))])) 但是,如何对列表中的最后n元素执行类似操作(不使用list ref) 如果我调用(倒计时3'(abcde)),我会得到(列出abc)。我需要能够输入(计数器3'(abcde))并获取(列表cde) 如果给定的编号大于列表的长度,我需要错误消

我知道如何获取列表中的第一个
n
元素

(define (countup n ls)
  (cond
    [(zero? n) '()]
    [else (cons (first ls) (countup (sub1 n) (rest ls)))]))
但是,如何对列表中的最后
n
元素执行类似操作(不使用list ref)

如果我调用
(倒计时3'(abcde))
,我会得到
(列出abc)
。我需要能够输入
(计数器3'(abcde))
并获取
(列表cde)


如果给定的编号大于列表的长度,我需要错误消息。

只需使用内置的
右转
过程,它会完全满足您的需要:

(take-right '(a b c d e) 3)
=> '(c d e)
或者,您可以使用基本过程从头开始实施:

(define (counter n lst)
  (define (move n lst)
    (if (zero? n)
        lst
        (move (sub1 n) (rest lst))))
  (define (trim-left lst rst)
    (if (empty? rst)
        lst
        (trim-left (rest lst) (rest rst))))
  (trim-left lst (move n lst)))
它也如预期的那样工作:

(counter 3 '(a b c d e))
=> '(c d e)

我想我会用一个本地的fn从左边切掉一些东西,然后把剩下的东西还回去。如果要求返回负数的项目,下面的语句也会返回'()。您可能也希望将此视为错误#f表示输入中有错误,即试图获取比列表中包含的项目更多的项目

(define (counter n loN)
  (define (acc loN c)
    (cond [(null? loN) '()]
          [(> c 0) (acc (cdr loN) (sub1 c))]
          [else loN]))
  ;in
  (let ((c (- (length loN) n)))
    (cond ; [(>= 0 n) #f]
          [(positive? c) (acc loN c)] 
          [else #f])))

(check-equal? (counter 3 '(a b c d e)) '(c d e))
(check-equal? (counter 6 '(a b c d e)) #f)
(check-equal? (counter -3 '(a b c d e)) '())
(check-equal? (counter 0 '(a b c d e)) '())

我需要能够在不使用take Right的情况下完成此操作。尽管我非常感谢您的帮助,但我不能使用trim、take、move或list-ref。我没有使用任何这些,我只是定义了两个助手过程,它们恰好被称为
move
trim left
。使用额外的助手是可以的,没有它们,你无法轻松解决这个问题。好的,我有本地人,但如果数字大于问题的大小,我需要添加错误list@KrissyMichaelsson学习此代码后,应该能够插入错误消息。查看
移动
。错误条件将如何在那里表现出来?当前编写的代码是否处理这种情况?