2014-04-01 54 views
0

我在語言中亂搞,需要一些幫助。我想創建一個交換函數,第一個交換與第二個交換。所以如果(交換'(a b c d e g)) 應該返回(b a d c e g)。我不想存儲任何值。在方案中有沒有功能或方法?我不知道我是否會這樣定義想在編程中交換元素

(DEFINE列表1(LIST 'A' B 'C' d「E))的列表

然後不知道該怎麼辦

+0

http://stackoverflow.com/questions/13564575/swap-two-elements-in-list-in-scheme –

+0

那不是我想要的東西。 –

+0

這沒有幫助。 –

回答

4

訣竅是一次處理兩個元素,交換它們並推進遞歸中的兩個元素。這就是我的意思是:

(define (swap lst) 
     ; if the list is empty or has a single element 
    (cond ((or (null? lst) (null? (cdr lst))) 
     ; then return that list 
     lst) 
     ; otherwise build a new list 
     (else 
     ; by first adding the second element 
     (cons (cadr lst) 
     ; and then adding the first element 
       (cons (car lst) 
     ; finally, advance the recursion over two elements 
        (swap (cddr lst))))))) 

我相信,在討論的採樣輸出是錯誤的,哪裏來自f?比如我所期待的結果將是:

(swap '(a b c d e g)) 
=> '(b a d c g e) 

(swap '(a b c d e)) 
=> '(b a d c e) 

(swap '(a)) 
=> '(a) 

(swap '()) 
=> '() 
+0

哦,我很抱歉你的權利。謝謝您的意見。幫助了我很多。我從來不懂用代碼打字的人,但你做得很好。 –

+0

我會的。其實是另一個問題當你有cond是空的時候? (cdr lst)))這是否意味着你拿出列表中的第一個元素並放入下一個2?和cadr實際上做了什麼。如果你能通過[email protected]給我發電子郵件,那也可以嗎? –

+0

如果列表中有奇數個元素,我們必須詢問是否存在'(null?(cdr lst))',因爲在這種情況下最後(單個)元素不能交換。 '(cadr x)'是'(car(cdr x))'的縮寫,'(cddr x)'是'(cdr(cdr x))'的縮寫,等等......你明白了。抱歉,我不通過電子郵件回答問題 –