2011-03-09 52 views
1

我需要做的事情基本上是這樣的:方案:順序執行

(define test 
    (λ (ls1 ls2) 
    (cond 
     ((empty? ls2) null) 
     (else 
     (append ls1 (car ls2)) (test ls1 (cdr ls2))) (displayln ls1)))) 

的問題是else從句和它後面的功能。我需要else子句的兩個子句來執行,然後我需要最後一個函數來執行,但我無法獲得正確的語法。

我需要(測試 '(1 2 3)'(4 5 6)),以導致顯示「(1 2 3 4 5 6),它有使用遞歸調用。

任何意見表示讚賞。

謝謝。

+0

我無法理解這是什麼程序應該做的。你確定它應該打印什麼東西,還是隻是應該將ls1和ls2追加到對方? – acfoltzer 2011-03-11 17:06:25

回答

1

如果你拼命想遞歸地解決這個問題,你不關心的返回值,使用

(define (test l1 l2) 
    (if (null? l2) 
    (displayln l1) 
    (test (append l1 (list (car l2))) (cdr l2)))) 

(這是非常低效的BTW:O(ñ×)內存分配。)

+0

非常感謝。效率目前不是問題。 – Schemer 2011-03-09 02:50:56

2

有一些問題存在。首先,你做一個列表和一個原子(不是列表)上追加...至少如果(car l2)是不是列表。其次,你可能認爲(append l1 (list (car l2))修改l1。但這種情況並非如此。結果是一個新的列表。

測序您的操作larsmans說你可以做。但你也可以編寫以下

(define (test l1 l2) 
    (if (null? l2) 
     (displayln l1) 
     (let ((l1-follow-by-car-l2 (append l1 (list (car l2))))) 
     (test l1-follow-by-car-l2 (cdr l2)))) 

這有完全一樣的行爲。