LISP中的遞歸和尾遞歸

    首先解釋一下概念:

    遞歸:是指在函數的定義中使用函數自身的方法。遞歸一詞還較常用於描述以自相似方法重複事物的過程。

     尾遞歸:在計算機科學裏,尾調用是指一個函數裏的最後一個動作是一個函數調用的情形:即這個調用的返回值直接被當前函數返回的情形。這種情形下稱該調用位置爲尾位置。若這個函數在尾位置調用本身(或是一個尾調用本身的其他函數等等),則稱這種情況爲尾遞歸,是遞歸的一種特殊情形。

    通常的遞歸會不斷的進行函數的壓棧等操作,效率有時候會比較低。在一些先進的編譯器中可以對尾遞歸進行優化,從而不用減輕傳統遞歸的效率低下問題。我們看看神奇的LISP語言如何實現遞歸和尾遞歸。

(defun factor-1 (n)
 "Calculate the factor of n"
 (if (= n 0)
  1
  (* n (factor-1 (- n 1)))))
  上述函數編寫很簡單。首先解釋一下這個程序,其中defun是定義函數的關鍵字。LISP的任何函數調用都是用括號的形式。函數聲明結束後的一對雙引號的內容表示這個函數的文檔。可以使用(documentation factor-1)的形式提取出來。LISP的函數名字基本沒有任何限制,不像一般語言對可用的符號存在限制。一般常量使用+XX+,宏使用*XX*,普通參數就使用一般的名字。LISP的命名style是利用橫線-,而不是下劃線或者匈牙利的方式。這個語句的意思是,如果n是0,則直接返回1,否則返回n*factor-1(n-1)。

(defun factor-2 (n)
  "Tail recursive edition"
  (factor-help n 1))

(defun factor-help (n m)
 "Tail recursive help function of factor-2"
 (if (= n 0)
  m
  (progn
   (factor-help (- n 1) (setf m (* m n))))))
  其中定義了兩個函數。factor-2 (n)表示計算階乘的函數,factor-help(n m)表示輔助會函數。通過它來實現尾遞歸的計算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章