2012-10-03 85 views
0

我正在嘗試編寫一個名爲unzip的函數,它需要一個列表並計算列表中包含原始列表的交替元素的兩個列表。將解壓列表分解爲兩個單獨的列表

到目前爲止,這是我所:

(define (unzip lst) 
    (if (null? lst) 
     '() 
     (... 

這是應該如何工作的:

(解壓「(1 A 2 B 3 C))應計算爲((1 2 3 )(abc))

回答

1

你有什麼是錯誤的軌道,對不起。 (想想結果應該是什麼,如果給出空的輸入)類似我的回答你最後一個問題,這裏有一個骨架的解決方案:

(define (unzip l) 
    (if (null? l) ??? 
     (let ([next (unzip ???)]) 
     (list (cons ??? ???) ???)))) 

填寫的???小號適當。 (是的,我的解決方案已經過測試,適用於奇數和偶數輸入。)

+0

'next'不是函數。它是'let'中定義的一個變量。現在,想想它應該在邏輯上做什麼。 (我已經將括號改爲正方形,更符合球拍的風格,希望這會讓事情更加明顯。) –

+0

是的,'next'確實是'(unzip(cdr l))'。現在,您應該考慮如何根據舊結果來組裝新結果。試試這個:想一想空的輸入是什麼結果。然後,對於單元素輸入。然後是2個元素。等等。你會很快知道你在每一步需要做什麼。 –

+0

'(cons(車l)???)部分是正確的。 '(cdr l)'部分不是。你能弄清楚爲什麼不呢? (另外,提示:至少有一個子表達式會涉及'next'變量,否則,首先定義它就沒有意義了。) –