2
我在LISP遞歸函數來旋轉列表向左或向右如下: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)))))
有沒有辦法使用尾遞歸來得到相同的結果? 功能旋轉右旋和左旋轉工作正常。
編輯: 我困惑。我上面寫的函數是tail-recursion。如果我沒看錯,這個功能是爲了同樣的目的常規遞歸:
(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))))))
你有你的左旋轉和右漢字功能可用?因爲它們將不得不被修改/包含在rotate-n中以便尾遞歸工作。 –
當然,我寫了他們,他們的工作。你認爲有可能通過尾遞歸來解決它嗎? –
是的,但我不知道這是一個好主意:效果是完全相同的兩種方式。這種方法非常像尾遞歸:在進行遞歸調用之前旋轉。 –