Схема: последовательное исполнение - PullRequest
1 голос
/ 09 марта 2011

Мне нужно сделать что-то вроде этого:

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

Проблема заключается в предложении else и последующей функции. Мне нужно выполнить оба условия предложения else, а затем мне нужно выполнить последнюю функцию, но я не могу получить правильный синтаксис.

Мне нужно (test '(1 2 3)' (4 5 6)), чтобы отобразить '(1 2 3 4 5 6), и он должен использовать рекурсивный вызов.

Любой совет приветствуется.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Здесь есть несколько проблем.Сначала вы добавляете список и атом (не список) ... по крайней мере, если (car l2) не является списком.Во-вторых, вы, вероятно, думаете, что (append l1 (list (car l2)) изменяет l1.Но это не так.Результатом является новый список.

Чтобы упорядочить свою операцию, вы можете сделать, как сказал Ларсман.Но вы также можете написать следующее

(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 голос
/ 09 марта 2011

Если вы отчаянно хотите решить эту проблему рекурсивно, и вам не важно возвращаемое значение, используйте

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

(Это очень неэффективно, между прочим: O ( n × m ).)

...