A cons
有兩個單元格。 car
和cdr
。一個單元可以顯示爲(a . b)
,其中a
和b
可以是任何東西。
有一對替代表示。如果b
是另一對或空列表,則可以將. b)
替換爲b
,而不是最初的(
。因此:
(a .()) ; ==> (a)
(a . (b . c)) ; ==> (a b . c)
(a . (b . (c .()))) ; ==> (a b c)
現在爲您的代碼。想象一下你用(1 2 3 4)
(或準確的說是(1 . (2 . (3 . (4 .()))))
)來試試。我們使用substitution rules準確計算您的程序的功能:
(reverse-list '(1 . (2 . (3 . (4 .()))))) ; ==>
(if (empty? '(1 . (2 . (3 . (4 .())))))
empty
(cons (reverse-list (rest '(1 . (2 . (3 . (4 .()))))))
(cons (first '(1 . (2 . (3 . (4 .())))))
empty))) ; ==>
(if #f
empty
(cons (reverse-list (rest '(1 . (2 . (3 . (4 .()))))))
(cons (first '(1 . (2 . (3 . (4 .())))))
empty))) ; ==>
(cons (reverse-list '(2 . (3 . (4 .()))))
(cons 1 empty)) ; ==>
(cons (cons (reverse-list '(3 . (4 .())))
(cons 2 empty))
(cons 1 empty)) ; ==>
(cons (cons (cons (reverse-list '(4 .()))
(cons 3 empty))
(cons 2 empty))
(cons 1 empty)) ; ==>
(cons (cons (cons (cons (reverse-list '())
(cons 4 empty))
(cons 3 empty))
(cons 2 empty))
(cons 1 empty)) ; ==>
(cons (cons (cons (cons '()
(cons 4 empty))
(cons 3 empty))
(cons 2 empty))
(cons 1 empty)) ; ==>
((((() . (4 .())) . (3 .())) . (2 .())) . (1 .())) ; ==>
((((() . (4)) . (3)) . (2)) . (1)) ; ==>
((((() 4) 3) 2) 1)
現在。一個真正的逆轉列表看起來會是這樣的點分表示法:
(4 . (3 . (2 . (1 .())))) ; ==> (4 3 2 1)
有沒有辦法解決它。您需要與cons
保持密切關係,並瞭解如何顯示構建它們的不同方式。一個提示是,幾乎每個列表都從頭到尾創建,並從頭到尾迭代。
所以我不是真的讓你在說什麼。看起來它與「空」有關,但我把它放進去,因爲drracket不會讓我在沒有它的情況下發揮作用 – Acoustic77 2014-10-18 03:22:51
這不是你的問題的「空洞」,而是你對「缺點」的使用。缺點需要兩件事 - 一個項目和一個列表。 '(cons 1'(2 3 4))'給你''(1 2 3 4)'。您使用cons是將*整個列表*放到第一位置,例如'(cons'(1 2)'(3 4))'=>''((1 2)3 4)',所以你會得到奇怪的嵌套。 Sylwester說的是你需要了解'cons'的作用以及如何使用它,以及爲什麼列表是通過向空列表中添加項目來創建的,以便理解你的代碼做錯了什麼。 – Jack 2014-10-18 09:28:41