方案:顺序执行

时间:2011-03-09 02:20:36

标签: recursion scheme racket

我需要做一些基本上这样的事情:

(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)并且必须使用递归调用。

感谢任何建议。

感谢。

2 个答案:

答案 0 :(得分: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)) ))  

这有完全相同的行为。

答案 1 :(得分:1)

如果您迫切希望以递归方式解决此问题,并且您不关心返回值,请使用

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

(这是非常低效的btw:O( n × m )内存分配。)