我試圖在我的CS類的Scheme(R5RS)中編寫一個過程,該過程需要一個表達式(符號或列表)作爲參數,並返回(1)可以通過在表達式上使用car和cdr形成的所有可能表達式和(2)以及表達如何獲得原始表達式的每個這些分量的表達式的列表。如果一件作品可以以多種方式獲得,則應該多次返回。Scheme:返回可以使用汽車和CDR的任意組合獲得的表達式的所有元素
Examples
(pieces '()) => ((() x))
(pieces 'apple) => ((apple x))
(pieces '(apple)) => (((apple) x) (apple (car x)) (() (cdr x)))
(pieces '(a (b c))) =>
(((a (b c)) x)
(a (car x))
(((b c)) (cdr x))
((b c) (car (cdr x)))
(b (car (car (cdr x))))
((c) (cdr (car (cdr x))))
(c (car (cdr (car (cdr x)))))
(() (cdr (cdr (car (cdr x)))))
(() (cdr (cdr x))))
由於我們剛剛開始計劃,我們僅限於這個任務相當基本的語法。這是我到目前爲止有:
(define pieces
(lambda (exp)
(cond
((symbol? exp)
(list exp 'x))
((null? exp)
(list '() 'x))
((list? exp)
(let ((b (pieces (car exp))) (c (pieces (cdr exp))))
(list exp 'x b c))))))
(pieces '()) => (() x)
(pieces 'apple) => (apple x)
(pieces '(apple)) => ((apple) x (apple x) (() x))
(pieces '(a (b c))) => ((a (b c)) x (a x) (((b c)) x ((b c) x (b x) ((c) x (c x) (() x)))
(() x)))
過程返回所有適當的元素,但每個遞歸導致嵌套在一個額外的組件列表中。有什麼辦法可以防止這種情況發生?
此外,我不知道從哪裏開始解決問題的第二部分(顯示每個元素是如何從原始使用汽車和CDR獲得的)。我嘗試了一百萬種不同的方法,他們中的任何一個都沒有接近工作。如果任何人有任何關於如何實現該功能的提示或建議,我會非常感激。萬分感謝。
聽起來像你想要所有的原子元素(即任何可以通過汽車和CDS鏈訪問),所以a * flatten()*操作應該給出你正在尋找的結果。 – 2012-01-29 02:41:15