在 Scheme 中编写尾递归过程

Writing tail recursive procedure in Scheme

我想将下面的代码转换为尾递归过程(它需要一个数字 'n' 和一个列表 'items' 和 returns 列表的第 n 个项目)。

(define (take n items)
   (if (= 0 n)
       '()
   (if (< (length items) n)
       items
       (cons (car items)
             (take (- n 1) (cdr items))))))

我试过这个代码

(define (take n items)
  (define (iter-lst n lst)
    (if (null? n)
        lst
        (iter-lst (- n 1) (cdr lst)))
  (iter-lst 0 items)))

(take 4 '(1 2 3 4 5))

这是一个可能的解决方案:

(define (take1 n items)
  (define (take-it k items res)
    (if (or (null? items) (>= k n))
        (reverse res)
        (take-it (+ k 1) (cdr items) (cons (car items) res))))
  (take-it 0 items '()))

如果第一个参数是负整数,这也适用。