2015-05-29 9 views
-2

我正在嘗試編寫一個程序,該程序需要一個數字列表並將1添加到列表中的每個元素。同樣,如果列表爲0,它將返回NIL。我試着遞歸做它,但它顯示我沒有輸出。我知道這很簡單,但我是一個初學者,我很難遞歸思考這個問題。謝謝!通用LISP附加程序

+0

當你說「試圖寫一個_program_」你真的是「試圖寫一個_function_」?此外,你說你嘗試了一些不起作用的東西......如果你需要關於_你的解決方案的幫助,你最好發佈你現有的解決方案,否則沒有人會給你提供他們現成的解決方案。 – gboffi

+0

「我試着遞歸做它,但它沒有顯示我輸出。」我不'看到你的問題。請注意,**尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者沒有用處。** –

+0

「這很簡單,但我是一個初學者,我很難遞歸思考這個問題。」爲什麼它會遞歸地進行遞歸? '(defun add-1(list)(mapcar'1+ list))''是什麼問題?你不需要知道mapcar是如何實現的(它*可以是遞歸的,但這是一個實現細節)。但你也可以''(在列表中收集x的循環(1 + x))''。這似乎是非遞歸的(儘管實現*可能是遞歸的),並且它也可以工作。這聽起來像你要麼承擔要求,要麼你有要求,你沒有說明。 –

回答

0

如果你的任務需要你定義一個遞歸函數(比如用於一般性)做一些事情列表中的每個元素上,你可以使用這個成語

(cons (do-something-on (car my-list)) (my-fun (cdr my-list))) 

,你

  1. 修改第1個要素
  2. 應用,你定義的列表的其餘部分
  3. 返回一個列表構造加入修改後的第1個要素和應用你定義到其餘的函數的結果的功能清單

這還不是全部,你必須考慮當你匆忙清單時會發生什麼...但這很容易,你可以編寫一個條件返回默認值(見上),如果列表是不是空的,否則nil

(if my-list (...) nil) 

,或者使用的其他少if的默認行爲,

(if my-list (...)) 
0

一個列表由cons組成。它有第一個值和一個列表,除了第一個值外,其餘都是由列表組成。因此,您應該檢查您的列表是否爲null(或者endp這是相同的),並且如果它不是您使用first計算出的cons以及使用rest的遞歸調用。作爲論據。

(add-1 '(1 . (2 . (3 .())))) ; ==> (2 . (3 . (4 .()))) 

或更常見的寫:

(add-1 '(1 2 3)) ; ==> (2 3 4)