2015-10-25 85 views
0

我是一個相對較新的方案用戶,我試圖做一個能夠檢查數字,符號和列表(包括嵌套列表)的相等性的函數。我已經嘗試了以下代碼的多種變體,並且無法提出可行的解決方案;主要的問題是,遇到嵌套列表後,如果原始列表中有更多元素,程序將不會繼續該點,並且我不確定如何使該函數適用於列表和數字/符號。任何幫助表示讚賞。Scheme(檢查列表,數字和符號是否相等)

作爲說明,我在Scheme中使用R5RS語言,我瞭解限制語言的功能。

(define (my-equal? a b) 
    (cond ((null? a)) 
     ((list? (car a))(my-equal? (car a)(car b))) 
     ((equal? (car a)(car b)) 
     (my-equal? (cdr a)(cdr b))) 
     (else #f))) 

回答

0

如果a滿足null?,你不明確地返回任何東西。但是,正確的答案是什麼?在這種情況下,如果您有(null? b),則平等成立。

接下來,你認爲你可以採取的acar和測試是對list?謂詞值。實際上,您首先必須檢查a本身是否是允許訪問其第一個元素的列表。

在您所有的下一個條款中,您操縱輸入的carcdr,而不是直接使用ab。 當你需要使用它們時,唯一的情況是當你確定ab是列表:那麼,他們是相等的,如果他們的car是相等的,他們也是cdr

其他情況下不能認爲這些值是列表。相反,當您的cond中的list?失敗時,您確定您正在處理另一種輸入。您不能在以下行中調用(car a)而不會發生錯誤。

然後,如果它們都是數字,字符串或其他類型,則必須提供其他比較方法ab

+0

謝謝,這是非常有幫助的! – TPerson

1

我不知道這是否是一個「我只是想實現它自己」的問題的類型,但在R5RS標準,爲equal?狀態的文檔:

平等?遞歸地比較對,矢量和字符串的內容,應用eqv?在數字和符號等其他對象上。經驗法則是物體通常是平等的?如果他們打印相同。等於?可能無法終止,如果它的參數是循環數據結構。

所以... equal?已經處理了嵌套的列表的遞歸查詢,矢量等

同樣,如果你在一個可以如何實現這樣的事情有興趣,那就不要讓我阻止你!