2016-08-17 104 views
-3

你們中的一些人可能會發現這個問題有點奇怪,但我真的想知道這個程序是否遞歸或不是,這就是我想知道的。遞歸與多個函數

(defun howmany(sez) 
    (if (null sez) 
     0 
    (+ 1 (howmany (cdr sez))))) 

(defun sum(sez) 
    (if (null sez) 
     0 
    (+ (car sez) (sum(cdr sez))))) 

(defun avg(sez) 
    (if (null sez) 
     0 
    (/ (sum sez) (howmany sez)))) 

(print (avg '(100 200 300))) 

謝謝你的答案!

+0

這幾乎是不可能讀取無格式的Lisp代碼。請縮進你的代碼。例如,您的代碼應該如下所示:http://pastebin.com/raw/ZdPp8A0i。使用問題下的[編輯](http://stackoverflow.com/posts/39005847/edit)鏈接。 –

+0

雖然你不清楚你在問什麼。 SUM自己調用,HOWMANY自己調用,所以這些都是遞歸的,當然。請注意,你可以'(defun avg(seq)(/(reduce'+ seq)(length seq))''不需要重新實現LENGTH和列表求和功能。 –

+0

這個東西是不允許用在所有必須實現的功能,但是我的想法是,這是遞歸的,我只是想讓更多的人對它進行一些考慮。 – anthraxa

回答

1

首先,來看看你的代碼和格式化多一點點,以便由利斯佩爾

(defun howmany (sez) 
    (if (null sez) 
     0 
     (+ 1 (howmany (cdr sez))))) 

(defun sum (sez) 
    (if (null sez) 
     0 
     (+ (car sez) (sum (cdr sez))))) 

(defun avg (sez) 
    (if (null sez) 
     0 
     (/ (sum sez) (howmany sez)))) 

(print (avg '(100 200 300))) 

輕鬆讀取然後analize這個腳本,它包含三個功能的最後S-評估功能的表達。

對於此三種功能,平均,總和的howmany,

有一個標題爲馬丁和龍一個故事,你可以在第8章從這裏Common Lisp: A Gentle Introduction to Symbolic Computation找到和你應該閱讀,其sumarizes在:

龍對於馬丁的問題不屑一顧, 居然喜歡教他遞歸。有一天它決定以 正式解釋遞歸的含義。龍告訴馬丁 處理每一個遞歸問題,就好像它是一次旅程。如果他按照遞歸解決問題的三條規則,他總是會成功地完成行程 。

龍解釋的規則是這樣的:

  1. 知道什麼時候停止。
  2. 決定如何採取一步。
  3. 打破這一步,再加上一個較小的旅程。

讓我們來看看功能的howmany和總結

  1. 知道什麼時候停止 停止經濟特區的時候是空的,即當列表是零

  2. 決定如何採取一個步驟

如果有兩種方式或兩種方式都是0或

(+ 1 (howmany (cdr sez))) 
(+ (car sez) (sum (cdr sez))) 
  • 打破joourney分解成步驟加一個較小的旅程
  • 過去表達式

    ,該列表是較小的取出,然後再繼續,較小的列表

    所以,這兩個函數是遞歸的,另一個avg不是遞歸的,只需要關心空的列表,以防止被零或零/零不確定分割。

    希望這會有幫助