在DrRacket的列表中获取最后n个元素,没有list-ref

时间:2016-03-28 01:35:24

标签: scheme racket

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

(define (countup n ls)
  (cond
    [(zero? n) '()]
    [else (cons (first ls) (countup (sub1 n) (rest ls)))]))

但是如何为列表中的最后 n元素执行此类操作(不使用list-ref)

如果我致电(countup 3 '(a b c d e)),我会获得(list a b c)。我需要输入(counter 3 '(a b c d e))并获取(list c d e)

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

2 个答案:

答案 0 :(得分:2)

只需使用内置的take-right程序,它就能满足您的需求:

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

答案 1 :(得分:0)

我想我会使用本地fn从左侧切碎项目,然后返回剩余的项目。如果要求返回负数项,则以下内容也会返回'()。您可能也希望将此视为错误。 #f表示输入错误,即尝试获取的项目多于列表

<b-form-input
  v-model="name"
  @input="$v.name.$touch()"
  :state="$v.name.$dirty ? !$v.name.$error : null"
/>