次のように、リストを右または左に回転させるために、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)))))
末尾再帰を使用して同じ結果を得る方法はありますか? 関数rotate-rightとrotate-leftは正常に機能します。
編集:混乱しました。上で書いた関数は末尾再帰です。私が間違っていなければ、この関数は同じ目的のための通常の再帰です:
(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))))))