我在 LISP 中有一个递归函数来向右或向左旋转列表,如下所示:
(如果数字为正 - 向左推,如果为负 - 向右推)
> (rotate-n ‘(5 6 7 8 9) -3)
(7 8 9 5 6)
> (rotate-n ‘(5 6 7 8 9) 3)
(8 9 5 6 7)
功能:
(defun rotate-n (L n)
(cond ((= n 0) L)
((> n 0) (rotate-n (rotate-left L) (- n 1)))
((< n 0) (rotate-n (rotate-right L) (+ n 1)))))
有没有办法使用尾递归获得相同的结果?向右旋转和向左旋转功能可以正常工作。
编辑:我很困惑。我上面写的函数是尾递归。如果我没记错的话,这个函数是出于相同目的的常规递归:
(defun rotate-n-r (L n)
(cond ((= n 0) L)
((> n 0) (rotate-left (rotate-n-r L (- n 1))))
((< n 0) (rotate-right (rotate-n-r L (+ n 1))))))