2011-03-09 33 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)))) 

这有完全一样的行为。