1

所以我对 acl2 和 lisp 还比较陌生,我不知道在 lisp 中这样做的方法。我怎样才能实现我的评论?(缺点...)我一直在思考迭代器,但有人告诉我 ACL2 只使用递归

(defun keep-at-most-n-bits (l n)
   ;cons a (up to n) 

   )

;;;unit tests.
(check-expect (keep-at-most-n-bits '(1 0 1 1) 3)  '(1 0 1))
(check-expect (keep-at-most-n-bits '(1 0 1 1) 2)  '(1 0))
(check-expect (keep-at-most-n-bits '(1 0 1 1) 8)  '(1 0 1 1))
4

1 回答 1

2

这看起来像你想要的:

(defun first-n (lst n acc)
  (if (or (= n 0) (eq lst nil))
      (reverse acc)
    (first-n (cdr lst) (- n 1) (cons (car lst) acc))))

(defun keep-at-most-n-bits (l n)
  (first-n l n '()))

这是通过创建一个辅助函数 ( first-n) 来实现的,该函数接受一个累加器变量。( acc)first-n调用自身,每次都使用输入列表的第一个值。一旦输入列表用完或n为 0,则该函数将累加器反转并返回。

现在,所有keep-at-most-n-bits需要做的就是用一个空的累加器触发辅助函数。

这是 Scheme 中相当常见的模式——但是,在 Scheme 中,您可以在需要它的函数中定义辅助函数。:) 我不确定您使用的方言是否支持它,所以我决定像这样安全地玩。:)

于 2018-10-18T17:17:33.880 回答