2011-03-09 4 views
1

나는 다음과 같이 기본적으로 뭔가를 할 필요가 :계획 : 순차적으로 실행

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

문제는 다른 절과 다음 기능입니다. 실행할 else 절의 두 절이 필요하고 마지막 함수를 실행해야하지만 구문을 올바르게 가져올 수 없습니다.

'(1 2 3 4 5 6)이 표시되도록하려면 ('test (1 2 3) '(4 5 6)) 필요하며 재귀 호출을 사용해야합니다.

모든 조언을 주시면 감사하겠습니다.

감사합니다.

+0

이 절차가 수행해야하는 작업을 이해하는 데 문제가 있습니다. 당신은 그것이 무언가를 인쇄하고 있다고 확신합니까, 아니면 단지'ls1'과'ls2'가 서로 붙어서 돌려 주어야한다고 생각합니까? – acfoltzer

답변

1

당신이 필사적으로 재귀 적으로이 문제를 해결하려면, 당신은이 BTW 매우 비효율적이다 (반환 값에 대해 신경

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

를 사용하지 않는 경우 : O (N × 미터) 메모리 할당).

+0

많은 감사. 효율은 현재 문제가되지 않습니다. – Schemer

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)))) 

이것은 정확히 같은 동작을합니다.