這是EOPL的練習。 過程(反轉lst)獲取lst,它是2列表的列表,並返回一個列表,每個2列表反轉。Scheme反轉2列表中的元素的函數
(define invert
(lambda (lst)
(cond((null? lst)
'())
((= 2 (rtn-len (car lst)))
(cons(swap-elem (car lst))
(invert (cdr lst))))
("List is not a 2-List"))))
;; Auxiliry Procedure swap-elements of 2 element list
(define swap-elem
(lambda (lst)
(cons (car (cdr lst))
(car lst))))
;; returns lengh of the list by calling
(define rtn-len
(lambda (lst)
(calc-len lst 0)))
;; calculate length of the list
(define calc-len
(lambda (lst n)
(if (null? lst)
n
(calc-len (cdr lst) (+ n 1)))))
這似乎工作,但看起來很冗長。這可以縮短或寫在更優雅的方式? 如何在任何單個元素中停止處理不是2列表? 目前執行進入下一個成員,並且如果當前成員不是2列表,則用「列表不是2列表」替換當前成員。
非常感謝。如何處理列表並退出單個元素的過程不是2列表。您的過程只是跳過額外的元素。 – sudhirc 2011-02-18 15:59:12