2012-11-01 78 views
4

我試圖編寫一個簡單的計劃函數,返回列表的最後一個元素。我的功能看起來像它應該工作,但是我設法失敗的東西:計劃獲得列表中的最後一個元素

(define (last_element l)(
    (cond (null? (cdr l)) (car l)) 
    (last_element (cdr l)) 
)) 

(last_element '(1 2 3)) should return 3 

DrRacket不斷給我的錯誤:

mcdr: contract violation 
    expected: mpair? 
    given:() 

由於(null? '())是真的,我不知道爲什麼這個不起作用。

這是一個函數,我認爲我需要做一個家庭作業(編寫函數last-element不是作業),並且說明中說我不能使用內置函數reverse,所以我不能只是做(car (reverse l))

如何修復此功能?

+0

如果你的函數通過空列表會發生什麼?當然,你的講師可能不在意。他或她是否會說出關於數據的假設?對於家庭作業的作業,我認爲可以合理的打折非列表數據,但空列表在列表上下文中是合理的。事實上,有一個簡單的方法來處理它,也可以合理處理其他非列表數據... – itsbruce

回答

9

你的語法是完全錯誤的。你在函數主體周圍有一個額外的圓括號,在cond子句的周圍還不夠,並且你的遞歸案例甚至不在cond之內,所以無論測試成功還是失敗都會完成。應遵循的程序工作:

(define (last_element l) 
    (cond ((null? (cdr l)) (car l)) 
     (else (last_element (cdr l))))) 
+5

@calccrypto這個答案的半滿版本是你幾乎所有的單個元素都是正確的。請記住,圓括號與花括號不同,你會想要打破「在第一行打開''('''並且把'''''放在他們自己的行上)的習慣。此外,讓DrRacket指導您縮進。你很快就會掌握它的。 –

0

你也可以這樣做。首先通過cdring命令找到列表的長度。然後使用list-ref x給出列表的x元素。 例如list-ref yourlistsname 0給出第一個元素(基本上是汽車的列表)。(list-ref yourlistsname( - length 1))給出列表的最後一個元素。

相關問題